2013-03-19 13 views
7

Ich habe ein Programm, das Datenbank der Völker und seiner Unternehmen implementiert. Ich habe dynamisches Array des Zeigers zu den Klassenmitgliedern anstelle des dynamischen Feldes der Klassenmitglieder verursacht, weil das Kopieren mit ihm schneller ist.Mismatch löschen

I-Version haben, die aber valgrind funktioniert zeigt Mismatch in destructor delete (löschen 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]; 
} 

ich auch

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

So hinzuzufügen verwenden Ich habe folgende Code versucht, die ich richtig vorher prüfen

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

Aber dann wird der gesamte Speicher, der durch Hinzufügen der Methode zugewiesen wurde, nicht freigegeben.

+3

(1) Kennen Sie die [Dreierregel] (http://stackoverflow.com/questions/4172722/what-is-the-rule-of-three)? (2) Haben Sie Smart Pointer und Container anstelle von rohen Pointern und dynamisch zugewiesenem Speicher in Betracht gezogen? –

Antwort

11

Die erste Probe ist fast korrekt. Sie löschen jedes Element in einer for-Schleife, aber dann versuchen Sie delete das Array.

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

Es sollte stattdessen sein:

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

Wenn Sie new ...[] verwenden, sollten Sie mit delete[] werden.

Vergessen Sie auch nicht die Rule of Three (oder Five (oder Zero)).

+3

Oder Null ......... – juanchopanza

1

Sie benötigen delete db[i] für jedes Element aber delete[] db für das Array selbst, also war keiner der Destruktoren korrekt.

mit new Foo[n] zugeordnet Arrays müssen mit der Array-Form, delete[] freigegeben werden, das ist, was valgrind über Mismatch neue Mittel/

+1

Besser noch, verwenden Sie nicht 'new []' oder 'delete []'. Verwende einen Vektor und sei glücklich. –

2

löschen Sie die falschen delete verwenden. Tun Sie dies:

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

Notiere die delete [] Anruf.