【问题标题】:Mismatch delete不匹配删除
【发布时间】:2013-03-08 20:45:16
【问题描述】:

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

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

但是随后通过添加方法分配的所有内存都没有被释放。

【问题讨论】:

  • (1) 你熟悉Rule of Three吗? (2) 您是否考虑过智能指针和容器而不是原始指针和动态分配的内存?

标签: c++ dynamic valgrind mismatch


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您使用了错误的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[]。使用矢量并快乐。
      猜你喜欢
      • 2018-01-01
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 2016-09-06
      • 2022-11-01
      • 2013-06-22
      • 2013-02-24
      相关资源
      最近更新 更多