আপনার উদাহরণে, *(p1 + 1) = 10;
ইউবি হওয়া উচিত, কারণ এটি অ্যারের শেষের অতীত আকারের 1 তবে আমরা এখানে একটি বিশেষ ক্ষেত্রে আছি, কারণ অ্যারেটি গতিশীলভাবে বৃহত্তর চর অ্যারেতে নির্মিত হয়েছিল।
ডায়নামিক অবজেক্ট ক্রিয়েশনটি সি ++ স্ট্যান্ডার্ডের এন 4659 খসড়ার The.৪ সি ++ অবজেক্ট মডেল [ইন্ট্রো.বজেক্ট] , in3 এ বর্ণিত হয়েছে :
3 যদি "এন স্বাক্ষরিত চরের অ্যারে" বা "এন স্টাড :: বাইটের অ্যারে" (21.2.1) টাইপের অন্য কোনও অবজেক্টের সাথে সম্পর্কিত স্টোরেজে একটি সম্পূর্ণ অবজেক্ট তৈরি করা হয় (8.3.4), তবে অ্যারে স্টোরেজ সরবরাহ করে তৈরি বস্তুর জন্য যদি:
(৩.১) - ই এর জীবদ্দশায় শুরু হয়েছে এবং শেষ হয়নি, এবং
(৩.২) - নতুন অবজেক্টের জন্য স্টোরেজ সম্পূর্ণরূপে ইয়ের মধ্যে ফিট করে, এবং
(৩.৩) - এর চেয়ে ছোট কোনও অ্যারে অবজেক্ট নেই যা এগুলি সন্তুষ্ট করে সীমাবদ্ধতা
3.3 বরং অস্পষ্ট বলে মনে হচ্ছে, তবে নীচের উদাহরণগুলি উদ্দেশ্যটিকে আরও স্পষ্ট করে তুলেছে:
struct A { unsigned char a[32]; };
struct B { unsigned char b[16]; };
A a;
B *b = new (a.a + 8) B;
int *p = new (b->b + 4) int;
উদাহরণস্বরূপ, buffer
অ্যারে উভয় এবং এর জন্য স্টোরেজ সরবরাহ করে*p1
*p2
।
নিম্নলিখিত অনুচ্ছেদগুলি প্রমাণ করে যে উভয়ের জন্য সম্পূর্ণ বস্তু *p1
এবং *p2
এটি buffer
:
4 একটি বস্তুর a অন্য অবজেক্টের মধ্যে
বাসা বাঁধে যদি: (4.1) - a খ এর একটি সাবওবজেক্ট বা
(4.2) - বি এর জন্য স্টোরেজ সরবরাহ করে, বা
(৪.৩) এর - সেখানে একটি অবজেক্ট সি রয়েছে যেখানে গ এর ভিতরে বাসা থাকে , এবং সি খ এর মধ্যে বাসা বাঁধে।
5 প্রতিটি অবজেক্ট এক্স এর জন্য কিছু অবজেক্ট থাকে যার নাম এক্স এর সম্পূর্ণ অবজেক্ট, নীচে নির্ধারিত হয়:
(5.1) - এক্স যদি একটি সম্পূর্ণ অবজেক্ট হয় তবে এক্স এর সম্পূর্ণ অবজেক্টটি নিজেই হয়।
(5.2) - অন্যথায়, x এর সম্পূর্ণ অবজেক্টটি (অনন্য) অবজেক্টের সম্পূর্ণ অবজেক্ট যা এক্স থাকে।
এটি একবার প্রতিষ্ঠিত হয়ে গেলে, সি ++ 17 এর জন্য খসড়া এন 4659 এর অন্যান্য প্রাসঙ্গিক অংশটি হল [বেসিক.কম্পাউন্ড] §3 (খনিতে জোর দিন):
3 ... পয়েন্টার ধরণের প্রতিটি মান নিম্নলিখিতগুলির মধ্যে একটি:
(3.1) - কোনও বস্তু বা ক্রিয়াকলাপের জন্য পয়েন্টার (পয়েন্টারটিকে বস্তু বা ফাংশনকে নির্দেশ করতে বলা হয়), বা
(3.2) - শেষের একটি পয়েন্টার কোনও অবজেক্টের (8.7), বা
(3.3) - এই ধরণের জন্য নাল পয়েন্টার মান (7.11), বা
(3.4) - একটি অবৈধ পয়েন্টার মান।
একটি পয়েন্টার ধরণের মান যা কোনও বস্তুর শেষের দিকে বা অতীতকে নির্দেশ করে বস্তুর
দ্বারা দখলকৃত স্টোরেজ শেষ হওয়ার পরে মেমরিতে প্রথম বাইটের (4.4) দখল করা বা স্মৃতিতে প্রথম বাইটের ঠিকানা উপস্থাপন করে যথাক্রমে [দ্রষ্টব্য: কোনও অবজেক্টের (8.7) শেষের একটি পয়েন্টার কোনও সম্পর্কহীনকে নির্দেশ করার জন্য বিবেচনা করা হয় নাঅবজেক্টের ধরণের জিনিস যা সেই ঠিকানায় অবস্থিত হতে পারে। একটি পয়েন্টার মানটি অবৈধ হয়ে যায় যখন স্টোরেজটি বোঝায় যে এটি তার সঞ্চয়স্থানের সময়কালের শেষে পৌঁছে; 6.7 দেখুন। Noteend নোট] পয়েন্টার গাণিতিক (8.7) এবং তুলনা (8.9, 8.10) এর উদ্দেশ্যে, এন অ্যারের x অ্যারের শেষ উপাদানটির শেষের পূর্বের একটি পয়েন্টারকে অনুমানক উপাদান x এর সাথে পয়েন্টারের সমতুল্য হিসাবে বিবেচনা করা হয় [ n]। পয়েন্টার ধরণের মান উপস্থাপনা বাস্তবায়ন-সংজ্ঞায়িত। বিন্যাস-সামঞ্জস্যপূর্ণ ধরণের পয়েন্টারগুলির একই মান উপস্থাপনা এবং প্রান্তিককরণের প্রয়োজনীয়তা (6.11) থাকতে হবে ...
নোট শেষে গত একটি পয়েন্টার ... এখানে প্রযোজ্য না, কারণ বস্তু দ্বারা প্রতি ইঙ্গিত p1
এবং p2
এবং সম্পর্কহীন , কিন্তু একই সম্পূর্ণ বস্তুর মধ্যে নেস্টেড, তাই পয়েন্টার arithmetics অবজেক্টের অভ্যন্তরে অর্থে যে স্টোরেজ প্রদান করুন: p2 - p1
সংজ্ঞায়িত করা হয় এবং (&buffer[sizeof(int)] - buffer]) / sizeof(int)
যে 1।
সুতরাং p1 + 1
এটি একটি পয়েন্টার *p2
, এবং *(p1 + 1) = 10;
আচরণ সংজ্ঞায়িত করেছে এবং এর মান নির্ধারণ করে *p2
।
আমি সি ++ 14 এবং বর্তমানের (সি ++ 17) মানের মধ্যে সামঞ্জস্যতার জন্য C4 সংযুক্তিও পড়েছি। একক চরিত্রের অ্যারেতে গতিশীলভাবে নির্মিত বস্তুর মধ্যে পয়েন্টার গাণিতিক ব্যবহারের সম্ভাবনা অপসারণ করা একটি গুরুত্বপূর্ণ পরিবর্তন হবে যে আইএমএইচওকে সেখানে উল্লেখ করা উচিত, কারণ এটি একটি সাধারণভাবে ব্যবহৃত বৈশিষ্ট্য। সামঞ্জস্যের পৃষ্ঠাগুলিতে এটি সম্পর্কে কিছুই বিদ্যমান না বলে আমি মনে করি যে এটি নিশ্চিত করে যে এটি নিষিদ্ধ করার মানদণ্ডের উদ্দেশ্য ছিল না।
বিশেষত, এটি কোনও ডিফল্ট নির্মাণকারী না করে কোনও শ্রেণীর অবজেক্টের অ্যারের সাধারণ গতিশীল নির্মাণকে পরাস্ত করবে:
class T {
...
public T(U initialization) {
...
}
};
...
unsigned char *mem = new unsigned char[N * sizeof(T)];
T * arr = reinterpret_cast<T*>(mem);
for (i=0; i<N; i++) {
U u(...);
new(arr + i) T(u);
}
arr
তারপরে কোনও অ্যারের প্রথম উপাদানটির পয়েন্টার হিসাবে ব্যবহার করা যেতে পারে ...