c++ - 不匹配删除

标签 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;
}

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

最佳答案

第一个样本几乎是正确的。您正在删除 for 循环中的每个元素,但随后您尝试删除 数组。

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))。

关于c++ - 不匹配删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15511982/

相关文章:

c++ - 使用带有 lambda 谓词的 std::remove_if 删除多个元素

c++ - 如何以像素(/逻辑单位)为单位获取字符串的宽度?

c++ - 如何在 Googletest 框架的多个测试中使用 "configurations"的全局变量

c++ - 指针传递,内存泄漏

c++ - 为什么析构函数不释放数组内存?

c++ - 使用 valgrind 测量缓存未命中

使用 go 动态创建编译后的二进制文件

java - 在java中的arrayList中生成动态对象名称

dynamic - 渲染后将几何体添加到 Three.js 网格中

有条件的跳跃或移动取决于未初始化的值