【问题标题】:strange C++Memory leak from 2D array来自二维数组的奇怪 C++ 内存泄漏
【发布时间】:2017-05-26 02:44:41
【问题描述】:

我正在使用 xcode 和工具来查找我的内存泄漏,它抱怨以下代码会造成内存泄漏:

double **cn2;
cn2= new double*[noOfItem];
for(int i=0;i<noOfItem;i++)
{
    cn2[i]=new double[noOfItem];
}
for(int i=0;i<noOfItem;i++)
{
    for(int j=0;j<noOfItem;j++)
    {
        cn2[i][j]=getCN2(noOfItem,i,j,pearson,cn2CutOff);
        //cout<<i<<" "<<j<<" "<< cn[i][j]<<endl;
    }

}
for(int i=0;i<noOfItem;i++)
{
    delete [] cn2[i];
}
delete [] cn2;

这是getCN2的函数,用来填充二维数组:

double getCN2(int _isize,int _i1,int _i2,double **sim,double _cutoff)
{
    //cout<< med<<" "<<med1<<endl;
    int count=0;

    for(int i=0; i<_isize; i++)
    {
        //if(sim[_i1][i]>_cutoff && sim[_i2][i]>_cutoff)
        if(sim[_i1][i]>sim[_i1][_i2] && sim[_i2][i]>sim[_i1][_i2] && sim[_i1][_i2]>0)
        {
            count++;
        }
    }
    //cout << rez/sqrt(rez1*rez2) <<endl;
    return count;
}

如果我将代码更改为:

double **cn2= new double*[noOfItem];
for(int i=0;i<noOfItem;i++)
{
    cn2[i]=new double[noOfItem];
}
for(int i=0;i<noOfItem;i++)
{
    for(int j=0;j<noOfItem;j++)
    {
        cn2[i][j]=getCN2(noOfItem,i,j,pearson,cn2CutOff);
        //cout<<i<<" "<<j<<" "<< cn[i][j]<<endl;
    }

}
for(int i=0;i<noOfItem;i++)
{
    delete [] cn2[i];
}
delete [] cn2;

我能想到的唯一可能的原因是当我调用 double **cn2;它已经指向某些东西,当我调用 cn2= new double*[noOfItem];它指向别的东西,原来的 **cn2 没有被释放?以前有没有其他人遇到过这个问题?真的很奇怪……用new分配的时候是不是必须写一行而不是2行?

【问题讨论】:

  • 如果在 new 和 delete 之间发生了意想不到的事情会发生什么?泄漏。
  • 使用智能指针的 10001 个理由...我建议您查找 std::shared_ptr 及其家族
  • @DKG 糟糕的建议
  • This has no memory leak。这是任何没有您的完整代码的人都必须从这里开始的地方。因此,除非您的内存报告工具是垃圾,否则您可能会破坏较大程序中其他地方的内存,并且它会影响您发布的代码。
  • @weeo - std::auto_ptr 已被弃用,我认为是因为它使许多人对某些用法感到困惑。也就是说,是的,如果您不打算复制它,它应该可以满足您的目的。

标签: c++ memory-leaks


【解决方案1】:

避免编码以避免此类错误

指针初始化是必须的

double *ptr = nullptr;

分配内存前需要检查

if (nullptr==ptr) { ....}

如果您编写新代码,请避免使用原始指针

unique_ptr. Allows exactly one owner of the underlying pointer. 
shared_ptr. Reference-counted smart pointer. ...
weak_ptr. Special-case smart pointer for use in conjunction with shared_ptr

调试技巧:-

使用visual studio查找内存相关错误 Buffer Overflow explained

使用诊断工具

Vld和并行工作室

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-06
  • 1970-01-01
  • 2013-09-30
  • 1970-01-01
  • 2015-05-09
  • 2021-03-28
相关资源
最近更新 更多