9

我有实现人民和他的公司数据库的程序。我创建了指向类成员的指针的动态数组,而不是类成员的动态数组,因为它的复制速度更快。

我有可以工作的版本,但 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;
}

但是,通过添加方法分配的所有内存都不会被释放。

4

3 回答 3

17

第一个样本几乎是正确的。您正在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[].

另外,不要忘记(或(或))规则。

于 2013-03-19T22:48:46.107 回答
5

你用错了delete。做这个:

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

注意delete []通话。

于 2013-03-19T22:49:57.720 回答
1

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

分配new Foo[n]的数组必须以数组形式释放delete[],这就是valgrind不匹配新/删除的意思

于 2013-03-19T22:48:58.613 回答