শূন্য দৈর্ঘ্যের অ্যারেতে পয়েন্টারের বৈশিষ্ট্য


21

বিবেচনা

int main()
{
    auto a = new int[0];
    delete[] a; // So there's no memory leak
}

অনুলিপি আরম্ভের অনুলিপি মধ্যে আপনি কি পয়েন্টারটি পড়তে পারবেন a + 1?

তদ্ব্যতীত, ভাষা কি সংকলকটিতে সেট aকরার অনুমতি দেয় nullptr?


2
@ ফারিওনর: আপনি aনিশ্চিতভাবে পড়তে পারেন (আপনি অবশ্যই এটি অবচয় করতে পারবেন না)।
বাথশেবা

8
@ রাসমি রঞ্জননায়ক: এটি হোগওয়াশ।
বাথশেবা

2
@ রসমি রঞ্জননায়ক ওহ আমার ... না
টেড লিঙ্গমো

1
@ টেডলাইংমো: আমি যখন "পয়েন্টার এ পড়ি" বলি a + 1, নীচের কোডটি কি অপরিবর্তিত auto b = a + 1;আচরণ? (আমি ভাবছি এটাই সেটা).
বাথশেবা

2
@ অ্যাক্সান আমি অনুমান করব যে ক্ষেত্রে 0আসলে এমন কিছু অভিব্যক্তির ফলাফল যা আপনি রানটাইম পর্যন্ত জানেন না। যেহেতু new int[0]সুরক্ষিত, এটি আপনাকে কিছু শাখা-প্রশাখা / বিশেষ ক্ষেত্রে উদ্বিগ্ন হতে পারে। আমি যদি এর std::vectorসাথে আরম্ভ করতাম তবে ভাবুন std::vector<int> v(0);
scohe001

উত্তর:


3
    auto a = new int[0];

[বেসাম.কম.পাউন্ড ৩.] এর মতে , সঞ্চিত মানটি aনিম্নলিখিতগুলির মধ্যে একটি হতে হবে:

  1. একটি বস্তুর পয়েন্টার (টাইপ int)
  2. একটি অবজেক্টের শেষের দিকের পয়েন্টার
  3. খালি
  4. অকার্যকর

intনির্মাণের ধরণের কোনও অবজেক্ট না থাকায় আমরা প্রথম সম্ভাবনাটি বাতিল করতে পারি । তৃতীয় সম্ভাবনাটি বাতিল করা হয়েছে যেহেতু সি ++ এর জন্য একটি নন-নাল পয়েন্টারটি ফেরত পাঠানো দরকার (দেখুন [বেসিক.এসটিসি.ডিনামিক.এলোকেশন ২]] )। সুতরাং আমরা দুটি সম্ভাবনা রেখেছি: একটি অবজেক্টের শেষ পয়েন্টার বা একটি অবৈধ পয়েন্টার।

আমি aএকটি অতীত-শেষ পয়েন্টার হিসাবে দেখার ঝোঁক হব, তবে এটিকে নিশ্চিতভাবে প্রতিষ্ঠিত করার জন্য আমার কাছে কোনও নামী রেফারেন্স নেই। (যদিও [বেসিক.এসটিসি] এ এটির একটি দৃlic় ধারণা রয়েছে , আপনি কীভাবে deleteএই পয়েন্টারটি করতে পারেন তা দেখে )) সুতরাং আমি এই উত্তরে উভয় সম্ভাবনা উপভোগ করব।

অনুলিপি আরম্ভের অনুলিপি মধ্যে আপনি কি পয়েন্টারটি পড়তে পারবেন a + 1?

[অপারেটর ৪.৪] দ্বারা নির্ধারিত আচরণটি অপরিজ্ঞাত , উপরের যে সম্ভাবনাটি তা প্রয়োগ না করেই।

যদি aএকটি অতীত-শেষ পয়েন্টার হয়, তবে এটি 0কোনও উপাদান ছাড়াই একটি অ্যারের সূচকে অনুমানীয় উপাদানটিকে নির্দেশ করে বলে মনে করা হয় । পূর্ণসংখ্যা যোগ করার পদ্ধতি jথেকে aসংজ্ঞায়িত করা হয় শুধুমাত্র যখন 0≤0+j≤n, যেখানে nঅ্যারের আকার। আমাদের ক্ষেত্রে, nশূন্য, সুতরাং যোগফল a+jকেবল তখনই সংজ্ঞায়িত jহয় 0। বিশেষত, সংযোজন 1অপরিজ্ঞাত।

যদি aঅবৈধ হয়, তবে আমরা পরিষ্কারভাবে "অন্যথায়, আচরণটি সংজ্ঞায়িত হয়" তে পড়ে যাই। (অবাক হওয়ার মতো বিষয় নয় যে সংজ্ঞায়িত সংস্থাগুলি কেবল বৈধ পয়েন্টার মানকে আচ্ছাদন করে))

তদ্ব্যতীত, ভাষা কি সংকলকটিতে সেট aকরার অনুমতি দেয় nullptr?

থেকে নং উল্লিখিত [basic.stc.dynamic.allocation.2] : "অনুরোধ সফল হলে, একটি পরিবর্তনযোগ্য বরাদ্দ ফাংশন দ্বারা ফেরত মূল্য অ নাল পয়েন্টার মান হল" । রয়েছে একটি পাদটীকা খুঁজে কলিং যে সি ++ (কিন্তু সি) একটি শূন্য অনুরোধ প্রতিক্রিয়ায় একটি অ নাল পয়েন্টার প্রয়োজন।


1
যদি এটি একটি অবৈধ পয়েন্টার মান হয় তবে আপনার eel.is/c++draft/basic.stc#4
টিসি

@ টিটিসি সত্য, এটি দৃ strongly়তার সাথে বোঝায় যে এটি একটি অবৈধ পয়েন্টার মান হতে পারে না।
JaMiT

23

প্রতি ফলে সাম্প্রতিক ফিটনেসে প্রতিফলক আলোচনা সম্পাদকীয় ইস্যু 3178 , new int[0]কি বর্তমানে বলা হয় উত্পাদন "অতীতে-শেষ" পয়েন্টার মান

এটা যে অনুসরণ aনাল না হতে পারে, এবং a + 1দ্বারা অনির্দিষ্ট হয় [expr.add] / 4


4
"সাম্প্রতিক সিডব্লুজি প্রতিফলক আলোচনার জন্য সম্পাদকীয় সংখ্যা 3178 এর ফলস্বরূপ, new int[0]বর্তমানে যা" অতীত-শেষ "পয়েন্টার মান বলা হয় এটি উত্পাদন করে এটি সঠিক নয়। খুব বেশি আলোচনা হয়নি। একজন ব্যক্তি পরামর্শ দিয়েছিলেন যে মানটি "একটি অবজেক্টের শেষের দিকের পয়েন্টার" হওয়া উচিত এবং এই বিবৃতিটি প্রশ্ন করা হয়েছিল কারণ 0উপাদানগুলির সাথে অ্যারের ক্ষেত্রে, শেষের অতীত হওয়ার কোনও বিষয় নেই।
ভাষা আইনজীবী

@ ল্যাঙ্গুয়েজলওয়েয়ার কোনও সন্দেহ নেই যে a + 1এটি কোনও ক্ষেত্রেই সংজ্ঞায়িত, সুতরাং আপনার বক্তব্যটি কেবল aনাল হতে পারে কিনা তার সাথে সম্পর্কিত ?
এমএম

উদ্দিষ্ট শব্দার্থবিজ্ঞানের বিষয়ে কোনও মতভেদ দেখা যায়নি, বা এই শ্রেণীর পয়েন্টার মানগুলির বর্তমান নাম এই দৃশ্যের পক্ষে খুব কম নয়।
টিসি

@ এমএম আমি মনে করি এটি অপরিজ্ঞাত a + 1এবং সম্ভবত ফলাফলের পয়েন্টার মানটিকে "শেষের দিকে পয়েন্টার" বলা হবে। আমি বলছি না যে উত্তরটি ভুল। এটি সামান্য সঠিক নয় কারণ এটি বোঝা যেত যে একটি sensকমত্যের সাথে দীর্ঘ আলোচনা হয়েছে যা কেবলমাত্র উল্লেখ করে যে ফলাফলটি "শেষের দিকে পয়েন্টার" ইস্যুটি সমাধান করার পক্ষে যথেষ্ট। "শেষের দিকের পয়েন্টার" এর সমস্যাটি হ'ল এটি কোনও অবজেক্টের শেষের অতীত এবং এ 1জাতীয় পয়েন্টার মান থেকে বিয়োগ করা একটি বস্তুকে একটি পয়েন্টার দেয় যা সম্ভবত 0উপাদানগুলির অ্যারেগুলির ক্ষেত্রে হওয়া উচিত নয় ।
ভাষা আইনজীবী

2
@ বাথশেবা আপনার কি মনে হয় ত্রুটিযুক্ত শব্দবহির্ভূত শব্দগুলির বিষয়ে আরও কিছু অনুমোদিত হতে পারে?
ভাষা আইনজীবী
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.