2013-03-19 9 views
7

Ho un programma che implementa il database dei popoli e delle sue società. Ho creato una matrice dinamica di puntatore ai membri della classe invece che alla matrice dinamica dei membri della classe, perché la copia è più veloce con essa.Mancata corrispondenza Elimina

Ho versione che funziona ma valgrind mostra mancata corrispondenza cancellare in distruttore (cancellare 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]; 
} 

Io uso anche di aggiungere

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

Così ho cercato seguente codice che ritengo corretto in precedenza

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

Ma poi tutta la memoria allocata aggiungendo metodo non è deallocata.

+3

(1) Conoscete la [Regola del Tre] (http://stackoverflow.com/questions/4172722/what-is-the-rule-of-three)? (2) Avete considerato puntatori e contenitori intelligenti invece di puntatori grezzi e memoria allocata dinamicamente? –

risposta

11

Il primo campione è quasi corretto. Stai eliminando ogni elemento in un ciclo for, ma poi provi a delete l'array.

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

Dovrebbe essere invece:

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

Ogni volta che si utilizza new ...[], si dovrebbe utilizzare delete[].

Inoltre, non dimenticare lo Rule of Three (o Five (o Zero)).

+3

O zero ......... – juanchopanza

1

È necessario delete db[i] per ciascun elemento ma delete[] db per l'array stesso, quindi nessuno dei distruttori era corretto.

Array assegnati con new Foo[n] devono essere deallocate con la forma matrice, delete[], questo è ciò che significa circa valgrind disadattamento nuova/delete

+1

Ancora meglio, non usare 'new []' o 'delete []'. Usa un vettore e sii felice. –

2

Si utilizza il torto delete. A questo scopo:

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

Nota la chiamata delete [].