2013-03-19 2 views
7

У меня есть программа, которая реализует базу данных о населении и его компаниях. Я создал динамический массив указателей на члены класса вместо динамического массива членов класса, потому что копирование происходит быстрее с ним.Несоответствие удалить

У меня есть версия, которая работает, но Valgrind показывает несовпадение удаление в деструкторе (удаление БД)

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

Еще лучше, не используйте 'new []' или 'delete []'. Используйте вектор и будьте счастливы. –

2

Вы используете неправильный delete. Сделайте это:

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

Обратите внимание на delete [] вызов.