2013-03-19 17 views
7

Mam program, który wdraża bazę danych ludzi i jego firm. Stworzyłem dynamiczną tablicę wskaźników dla członków klasy zamiast dynamicznej tablicy członków klasy, ponieważ kopiowanie jest szybsze.Niezgodność Usuń

Mam wersję, która działa, ale valgrind pokazuje niezgodność usunąć w destructor (usuwanie 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]; 
} 

używam również dodać

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

Więc próbowałem następujący kod, który uważam za prawidłowe poprzednio

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

Ale wtedy cała pamięć przydzielona przez dodanie metody nie jest zwolniona.

+3

(1) Czy znasz [Zasada Trzech] (http://stackoverflow.com/questions/4172722/what-is-the-rule-of-three)? (2) Czy brałeś pod uwagę inteligentne wskaźniki i pojemniki zamiast surowych wskaźników i dynamicznie przydzielanej pamięci? –

Odpowiedz

11

Pierwsza próbka jest prawie poprawna. Usuwasz każdy element z pętli for, ale wtedy próbujesz uzyskać delete tablicę.

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

Należy zamiast być:

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

Gdy używasz new ...[], należy używać delete[].

Ponadto nie zapomnij o Rule of Three (lub Five (lub Zero)).

+3

Lub zero ......... – juanchopanza

1

Potrzebujesz dla każdego elementu , ale delete[] db dla samej tablicy, więc żaden destruktor nie jest poprawny.

Tablice dedykowanych z new Foo[n] muszą być zwalniane z postaci tablicy, delete[], to znaczy o co valgrind niedopasowanie new/delete

+1

Lepiej, nie używaj 'new []' lub 'delete []'. Użyj wektora i bądź szczęśliwy. –

2

Używasz niewłaściwy delete. Zrób to:

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

Uwaga na połączenie delete [].

Powiązane problemy