आपके उदाहरण में, *(p1 + 1) = 10;
यूबी होना चाहिए, क्योंकि यह आकार के सरणी के अंत में एक है । 1. लेकिन हम यहां एक बहुत ही विशेष मामले में हैं, क्योंकि सरणी को गतिशील रूप से एक बड़े चार्ट में बनाया गया था।
गतिशील वस्तु निर्माण का वर्णन 4.5 सी C ++ ऑब्जेक्ट मॉडल [intro.object] में किया गया है, C ++ मानक के n4659 ड्राफ्ट का is3:
3 यदि एक पूर्ण ऑब्जेक्ट बनाया गया है (8.3.4) स्टोरेज में एक अन्य ऑब्जेक्ट ई के प्रकार के साथ जुड़ा हुआ है "एन अहस्ताक्षरित चार का सरणी" या "एन एसटी की सरणी :: बाइट" (21.2.1) प्रकार, वह सरणी भंडारण प्रदान करता है यदि बनाई गई वस्तु के लिए:
(3.1) - ई का जीवनकाल शुरू हो गया है और समाप्त नहीं हुआ है, और
(3.2) - नई वस्तु के लिए भंडारण पूरी तरह से ई के भीतर फिट बैठता है, और
(3.3) - कोई भी छोटी वस्तु नहीं है जो इन्हें संतुष्ट करती है बाधाओं।
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 एक वस्तु को किसी अन्य वस्तु b के भीतर घोंसला बनाया जाता है यदि:
(4.1) - a, b का उप-बिंदु है, या
(4.2) - b, a, या
(4.3) के लिए भंडारण प्रदान करता है - एक वस्तु c मौजूद है जहाँ a, c के भीतर nested है , और c, b के भीतर नेस्टेड है।
5 प्रत्येक ऑब्जेक्ट x के लिए, x के पूर्ण ऑब्जेक्ट नामक कुछ ऑब्जेक्ट है, जो निम्नानुसार है:
(5.1) - यदि x एक पूर्ण ऑब्जेक्ट है, तो x का पूर्ण ऑब्जेक्ट स्वयं है।
(५.२) - अन्यथा, x का पूरा ऑब्जेक्ट (यूनिक) ऑब्जेक्ट का पूरा ऑब्जेक्ट है जिसमें x है।
एक बार यह स्थापित हो जाने के बाद, C ++ 17 के लिए ड्राफ्ट n4659 का अन्य प्रासंगिक हिस्सा [basic.coumpound] mine3 (मेरा जोर दें):
3 ... पॉइंटर प्रकार का प्रत्येक मान निम्न में से एक है:
(3.1) - किसी ऑब्जेक्ट या फ़ंक्शन के लिए एक पॉइंटर (पॉइंटर को ऑब्जेक्ट या फ़ंक्शन को इंगित करने के लिए कहा जाता है), या
(3.2) - एक सूचक पिछले छोर पर एक ऑब्जेक्ट (8.7), या
(3.3) - उस प्रकार के लिए अशक्त सूचक मान (7.11), या
(3.4) - एक अमान्य सूचक मान।
एक सूचक प्रकार के या किसी वस्तु के अंत अतीत एक सूचक है कि मान स्मृति (4.4) में पहली बाइट के पते का प्रतिनिधित्व वस्तु के कब्जे में भंडारण के अंत के बाद स्मृति में या पहले बाइट
वस्तु के कब्जे में , क्रमशः। [नोट: किसी वस्तु (not.ter) के अंत में एक संकेतक पिछले एक असंबंधित को इंगित करने के लिए नहीं माना जाता हैऑब्जेक्ट का प्रकार जो उस पते पर स्थित हो सकता है। एक पॉइंटर मान अमान्य हो जाता है जब यह स्टोरेज जो नोट करता है वह अपनी भंडारण अवधि के अंत तक पहुंचता है; देखें 6.7। -एंड नोट] सूचक अंकगणितीय (8.7) और तुलना (8.9, 8.10) के प्रयोजनों के लिए, एन तत्वों के एक एक्स के अंतिम तत्व के अंत में एक सूचक को एक काल्पनिक एक्स के लिए एक सूचक के बराबर माना जाता है [ n]। सूचक प्रकारों का मूल्य प्रतिनिधित्व कार्यान्वयन-परिभाषित है। लेआउट-संगत प्रकारों के संकेत समान मान प्रतिनिधित्व और संरेखण आवश्यकताएं (6.11) होंगे ...
टिप्पणी अंत अतीत एक संकेतक ... यहाँ लागू नहीं होता क्योंकि वस्तुओं के द्वारा की ओर इशारा किया p1
और p2
और नहीं असंबंधित , लेकिन एक ही पूरा वस्तु में नेस्टेड रहते हैं, तो सूचक arithmetics ऑब्जेक्ट के अंदर इस अर्थ में कि भंडारण प्रदान करते हैं: p2 - p1
परिभाषित किया गया है और है (&buffer[sizeof(int)] - buffer]) / sizeof(int)
वह 1 है।
तो p1 + 1
है करने के लिए एक सूचक *p2
है, और *(p1 + 1) = 10;
परिभाषित व्यवहार है और का मान सेट *p2
।
मैंने C4 एनेक्स को C ++ 14 और वर्तमान (C ++ 17) मानकों के बीच संगतता पर भी पढ़ा है। गतिशील रूप से एकल वर्ण सरणी में बनाई गई वस्तुओं के बीच सूचक अंकगणित का उपयोग करने की संभावना को हटाने से एक महत्वपूर्ण बदलाव होगा कि IMHO को वहां उद्धृत किया जाना चाहिए, क्योंकि यह आमतौर पर उपयोग की जाने वाली विशेषता है। जैसा कि इसके बारे में कुछ भी संगतता पृष्ठों में मौजूद नहीं है, मुझे लगता है कि यह पुष्टि करता है कि यह इसे मना करने के लिए मानक का इरादा नहीं था।
विशेष रूप से, यह उस वर्ग के ऑब्जेक्ट के सामान्य गतिशील निर्माण को हरा देगा जिसमें कोई डिफ़ॉल्ट निर्माता नहीं है:
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
फिर एक सरणी के पहले तत्व के लिए एक संकेतक के रूप में इस्तेमाल किया जा सकता है ...