2013-03-19 11 views
7

मेरे पास ऐसा प्रोग्राम है जो लोगों और उनकी कंपनियों के डेटाबेस को लागू करता है। मैंने क्लास सदस्यों के गतिशील सरणी के बजाय क्लास सदस्यों को पॉइंटर की गतिशील सरणी बनाई है, क्योंकि प्रतिलिपि इसके साथ तेज है।मिस्चैच हटाएं

मैं संस्करण है जो लेकिन valgrind काम करता है पता चलता बेमेल नाशक में हटाना (db हटाना)

CCompany** db; 

~CCompanyIndex (void) 
{ 
    for(unsigned i=0;i<len;i++) 
    { 
     /*cout<<"dealloc:"<<db[i]<<endl;*/ 
     delete db[i]; 
    } 
    delete db; 
} 

CCompanyIndex (void) 
{ 
    max=1000; 
    len=0; 
    db=new CCompany*[max]; 
} 

मैं

CCompany* newIt=new CCompany(oName,oAddr,cName,cAddr); 

तो मैं कोड जो मैं सही, जिन पर निम्नलिखित की कोशिश की है जोड़ने के लिए भी उपयोग

~CCompanyIndex (void) 
{ 
    delete [] db; 
} 

लेकिन फिर विधि जोड़कर आवंटित सभी स्मृति को हटाया नहीं गया है।

+3

(1) क्या आप [नियम के तीन] से परिचित हैं (http://stackoverflow.com/questions/4172722/what-is-the-rule-of-three)? (2) क्या आपने कच्चे पॉइंटर्स और गतिशील रूप से आवंटित स्मृति के बजाय स्मार्ट पॉइंटर्स और कंटेनर माना है? –

उत्तर

11

पहला नमूना लगभग सही है। आप प्रत्येक तत्व को for लूप में हटा रहे हैं, लेकिन फिर आप delete सरणी का प्रयास करते हैं।

for(unsigned i=0;i<len;i++) { delete db[i]; } 
delete db; 

यह बजाय होना चाहिए:

for(unsigned i=0;i<len;i++) { delete db[i]; } 
delete[] db; 

जब भी आप new ...[] उपयोग करते हैं, आप delete[] का उपयोग करना चाहिए।

इसके अलावा, Rule of Three (या Five (या Zero) को न भूलें)।

+3

या शून्य ......... – juanchopanza

1

आपको प्रत्येक तत्व के लिए delete db[i] की आवश्यकता है लेकिन सरणी के लिए delete[] db, इसलिए न तो विनाशक सही था।

सरणी new Foo[n] साथ आवंटित सरणी फार्म, delete[] साथ पुनः आवंटित की जाती किया जाना चाहिए, कि क्या valgrind के बारे में बेमेल नया अर्थ बताया गया है/

+1

बेहतर अभी भी, 'नया [] 'या' हटाएं [] 'का उपयोग न करें। एक वेक्टर का प्रयोग करें और खुश रहो। –

2

हटाना तुम गलत delete उपयोग कर रहे हैं। ऐसा करें:

CCompanyIndex::~CCompanyIndex() 
{ 
    for(unsigned i=0; i<len;i++) delete db[i]; 
    delete [] db; 
} 

delete [] कॉल पर ध्यान दें।

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