क्या एरे के लिए इसका उपयोग करते समय वास्तव में पोर्टेबल कोड में प्लेसमेंट का उपयोग करना संभव है?क्या पोर्टेबल तरीके से सरणी के लिए नया प्लेसमेंट इस्तेमाल किया जा सकता है?
ऐसा प्रतीत होता है कि जो सूचक आप नए से वापस प्राप्त करते हैं [] हमेशा आपके द्वारा दर्ज किए गए पते के समान नहीं होता है (5.3.4, मानक में नोट 12 यह पुष्टि करता है कि यह सही है), लेकिन मैं ' टी यह देखने के लिए कि यदि आप इस मामले में जाने के लिए सरणी के लिए एक बफर आवंटित कर सकते हैं तो देखें।
निम्नलिखित उदाहरण समस्या दिखाता है। दृश्य स्टूडियो के साथ संकलित, इस उदाहरण स्मृति भ्रष्टाचार में परिणाम:
#include <new>
#include <stdio.h>
class A
{
public:
A() : data(0) {}
virtual ~A() {}
int data;
};
int main()
{
const int NUMELEMENTS=20;
char *pBuffer = new char[NUMELEMENTS*sizeof(A)];
A *pA = new(pBuffer) A[NUMELEMENTS];
// With VC++, pA will be four bytes higher than pBuffer
printf("Buffer address: %x, Array address: %x\n", pBuffer, pA);
// Debug runtime will assert here due to heap corruption
delete[] pBuffer;
return 0;
}
स्मृति को देखते हुए, संकलक उस में वस्तुओं की संख्या की गिनती स्टोर करने के लिए बफर के पहले चार बाइट्स का उपयोग किया जा रहा है। इसका मतलब है कि क्योंकि बफर केवल sizeof(A)*NUMELEMENTS
बड़ा है, सरणी में अंतिम तत्व आवंटित ढेर में लिखा गया है।
तो सवाल यह है कि आप यह पता लगा सकते हैं कि नियुक्ति नया [] सुरक्षित रूप से उपयोग करने के लिए आपका कार्यान्वयन कितना अतिरिक्त ओवरहेड चाहता है? आदर्श रूप में, मुझे एक ऐसी तकनीक की आवश्यकता है जो विभिन्न कंपाइलरों के बीच पोर्टेबल हो। ध्यान दें कि, कम से कम वीसी के मामले में, ओवरहेड अलग-अलग वर्गों के लिए अलग दिखता है। उदाहरण के लिए, यदि मैं उदाहरण में वर्चुअल विनाशक को हटा देता हूं, तो नया [] से लौटाया गया पता उसी पते जैसा है जो मैं पास करता हूं।
आह श्राप।मैंने आपके प्रश्न का एक डुप्लिकेट किया :([ऐरे प्लेसमेंट-नए को बफर में अनिर्दिष्ट ओवरहेड की आवश्यकता है?] (Http://stackoverflow.com/questions/8720425/array-placement- new-requires-unspecified-overhead-in-the -बफर) –
हम्म ... यदि आप वर्चुअल विनाशक को हटाते हैं तो ओवरहेड गायब हो जाता है, जो यह सुझाव देगा कि ओवरहेड कक्षा के vtable से या आरटीटीआई के VStudio के कार्यान्वयन से होने की संभावना है। –
या कम से कम, ओवरहेड है। यह भी संभव है कि ओवरहेड का उपयोग केवल तभी किया जाता है जब कक्षा में एक गैर-तुच्छ विनाशक होता है। –