У меня есть программа, которая реализует базу данных людей и его компаний. Я создал динамический массив указателей на члены класса вместо динамического массива членов класса, потому что копирование происходит быстрее.
У меня есть версия, которая работает, но 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;
}
Но тогда вся память, выделенная методом добавления, не освобождается.
Первый образец почти правильный. Вы удаляете каждый элемент в 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 (или же Нуль)).
Вы используете неправильно delete
, Сделай это:
CCompanyIndex::~CCompanyIndex()
{
for(unsigned i=0; i<len;i++) delete db[i];
delete [] db;
}
Обратите внимание delete []
вызов.
Тебе нужно delete db[i]
для каждого элемента, но delete[] db
для самого массива, поэтому ни один деструктор не был правильным.
Массивы, выделенные с new Foo[n]
должен быть освобожден с помощью формы массива, delete[]
, это то что valgrind
значит о несоответствии new / delete