Несоответствие удалить

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

У меня есть версия, которая работает, но 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;
}

Но тогда вся память, выделенная методом добавления, не освобождается.

7

Решение

Первый образец почти правильный. Вы удаляете каждый элемент в 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[],

Кроме того, не забывайте Правило трех (или же 5 (или же Нуль)).

11

Другие решения

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

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

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

3

Тебе нужно delete db[i] для каждого элемента, но delete[] db для самого массива, поэтому ни один деструктор не был правильным.

Массивы, выделенные с new Foo[n] должен быть освобожден с помощью формы массива, delete[], это то что valgrind значит о несоответствии new / delete

1
По вопросам рекламы [email protected]