2012-04-26 15 views
7

मुझे एक सी ++ रीफ्रेशर चाहिए। यह स्मृति अपवाद क्यों देता है?चार * नई और हटाएं [] त्रुटि जब एक स्ट्रिंग असाइन की जाती है

pear = new char[1024]; 
pear = "happy go lucky"; 
delete [] pear; // exception 
+0

'char * नाशपाती = नया चार [1024]; 'के बराबर पहली पंक्ति है? –

उत्तर

9
pear = new char[1024]; 

1024 चरित्र के लिए मेमोरी और यह के शुरू करने के pear अंक ढेर से आवंटित किया जाता है।

pear = "happy go lucky"; 

pear अब स्ट्रिंग शाब्दिक जो केवल पढ़ने के खंड में रहता है और पहले से आबंटित स्मृति लीक कर रहा है के लिए अंक।

delete [] pear; 

आप केवल पढ़ने के लिए स्ट्रिंग है, जो एक अपरिभाषित व्यवहार एक क्रम अपवाद के रूप में प्रकट होता है मुक्त करने के लिए प्रयास करें।

+0

एएच थे! यह सही है ... धन्यवाद। – Jake

5

नाशपाती = "खुश भाग्यशाली जाना";

यह की जगह सूचक new char[] द्वारा आवंटित। तो अब आपके delete[] pear स्थिर आवंटित स्ट्रिंग को मुक्त करने का प्रयास करता है।

यह बुरा है। आप केवल delete कर सकते हैं जो आप new के साथ आवंटित करते हैं। और चूंकि आप उस पॉइंटर को ओवरराइट (और खो देते हैं), तो आप delete नहीं कर सकते हैं।

+0

+1 क्योंकि आप पहले – Jake

2

आप जो कर रहे हैं वह pear को ढेर पर वर्णों की आवंटित सरणी में असाइन करना है, और उसके बाद स्थिर स्थिति में मौजूद स्ट्रिंग को इंगित करने के लिए इसे पुन: असाइन करना है। यदि आप इसे हटाने का प्रयास करते हैं तो यह त्रुटि होगी क्योंकि आपको उस स्थिर स्थान में सामान को हटाना नहीं है।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^