不匹配删除

时间:2013-03-19 22:45:51

标签: c++ dynamic valgrind mismatch

我有实现人民及其公司数据库的程序。我已经创建了指向类成员的动态数组指针而不是类成员的动态数组,因此使用它可以更快地进行复制。

我的版本有效,但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 个答案:

答案 0 :(得分:14)

第一个样本几乎是正确的。您正在删除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))。

答案 1 :(得分:3)

您使用的是错误的delete。这样做:

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

请注意delete []来电。

答案 2 :(得分:1)

每个元素都需要delete db[i],但数组本身需要delete[] db,因此析构函数都不正确。

使用new Foo[n]分配的数组必须使用数组表单delete[]取消分配,valgrind表示不匹配新/删除