c++ - पी=नई स्ट्रिंग के बाद[0] और पी=नया इंट[0], क्यों स्ट्रिंग संस्करण क्रैश हो जाता है जब हटाएं[] पी?



pointers new-operator (1)

यह एक जीसीसी बग होना चाहिए। कि पूरी new[] अभिव्यक्ति को अनदेखा कर दिया जाता है और p अनिनलाइज्ड हो जाता है, और फिर हम एक अपरिहार्य सूचक को delete[] जो क्रैश हो जाता है। अगर हम प्रोग्राम को संकलित करते हैं - यह आपको चेतावनी देगा कि

चेतावनी: इस फ़ंक्शन में 'पी' का उपयोग शुरू नहीं किया गया है

जो स्पष्ट रूप से गलत है अभिव्यक्ति new X[0] को सी ++ 03 और सी ++ 11 (§5.3.4 / 7) दोनों में अच्छी तरह से परिभाषित किया गया है, और यह सही ढंग से झंकार में काम करता है, इसलिए केवल तार्किक निष्कर्ष यह है कि यह जीसीसी बग है।

new[] बग का उन्मूलन तब होता है जब उस प्रकार का निर्माण किया जा सकता है जिसमें कोई भी गैर-तुच्छ कन्स्ट्रक्टर नहीं होता है। और segfault होता है प्रकार के एक विनाशक है, क्योंकि delete[] तो dereference की आवश्यकता होगी कि uninitialized सूचक इसलिए, यह std::string लिए क्रैश std::string लेकिन int नहीं, क्योंकि int है और std::string नहीं है।

इसे मध्यवर्ती वैरिएबल का उपयोग करके आसपास काम किया जा सकता है, जैसे अभिव्यक्ति का मूल्यांकन सीधे 0 तक नहीं किया जा सकता है:

size_t length = 0;
std::string* p = new std::string[length];
// ...
delete[] p;

मेरे पास new[] के बारे में कोड के दो ब्लॉक हैं new[] और delete[] :

1)

#include <string>

int main()
{
  std::string *p = new std::string[0];
  delete[] p;

  return 0;
}

2) इस मामले में, मैं केवल int को std::string को बदलता हूं

int main()
{
  int *p = new int[0];

  delete[] p;

  return 0;
}

मेरा सवाल यह है कि:

क्यों पहला प्रोग्राम निम्न संदेश (लिनक्स पर्यावरण में) के साथ क्रैश करता है:

Segmentation fault (core dumped)

लेकिन दूसरा प्रोग्राम बिना किसी त्रुटि के काम करता है?

संपादित करें

कंपाइलर: g++ (Ubuntu/Linaro 4.7.2-2ubuntu1) 4.7.2

मैं इसे संकलित करने के लिए बिना तर्क के g++ उपयोग करता हूं।

यदि यह एक संकलक बग है, तो क्या वे क्रैश हो या न मानक के अनुसार?





delete-operator