2012-12-27 12 views
6

अगर मैंसंकेत - डुप्लिकेट वस्तु दृष्टान्त

Class *a1 = new Class(); 
Class *b1 = a1; 

delete b1; 
delete a1; //this will give a double free or corruption message; 

अगर मैं सूचक ख हटाते हैं, तो यह सूचक एक सही हटाने के समान है है? चूंकि दोनों कक्षा के एक ही उदाहरण पर इंगित कर रहे हैं। तो, मैं ए 1 से बी 1 के उदाहरण की प्रतिलिपि कैसे बना सकता हूं ताकि जब मैं बी 1 हटा दूं, ए 1 हटाया नहीं गया है।

Class *a1 = new Class(); 
Class *b1 = a1; 

//how do I duplicate the instance a1 is pointing 
//so that when I delete b1, a1 still exists. 

delete b1; 
delete a1; //this is still valid 

धन्यवाद।

+1

आवश्यक सभी पॉइंटर्स के बारे में निश्चित नहीं है, लेकिन 'कक्षा * बी 1 = नई कक्षा (* ए 1);' इसे करना चाहिए। – chris

+0

सुनिश्चित करें कि आपकी प्रतिलिपि निर्माता ठीक है और * a1 से एक नई प्रति बनाएं। – halfelf

+0

यह आसान था @ @ धन्यवाद – tambalolo

उत्तर

10

क्या कोई कारण है कि आप पॉइंटर्स और आवंटन का उपयोग कर रहे हैं? अन्यथा

Class a1; 
... 
Class b1 = a1; 

को हटाने के लिए यहां कोई आवश्यकता नहीं है।

आप संरचना रखने के लिए के रूप में यह आप

Class *a1 = new Class(); 
Class *b1 = new Class(*a1); 

या

Class *a1 = new Class(); 
Class *b1 = new Class(); 
*b1 = *a1; 

इसका मतलब यह है कि आप एक मान्य प्रतिलिपि-निर्माता है (उदाहरण के लिए # 1) या असाइनमेंट ऑपरेटर क्या करने की जरूरत है की जरूरत है (उदाहरण # 2)

ps: कच्चे पॉइंटर्स के बजाय सुरक्षित होने के बजाय std::unique_ptr का उपयोग करने का प्रयास करें।

+2

क्या होगा यदि किसी और ने कक्षा लिखी और उन्होंने कॉपी-कन्स्ट्रक्टर या असाइनमेंट ऑपरेटर नहीं जोड़ा? – corro

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