奇怪的C++2D阵列的内存泄漏

strange C++Memory leak from 2D array

本文关键字:内存 泄漏 阵列 C++2D      更新时间:2023-10-16

我正在使用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的函数,它用于填充2d数组:

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;

我能想到的唯一可能的原因是,当我调用双 **cn2 时; 它指向已经指向某些东西,当我调用 cn2= new double*[noOfItem]; 它指向其他东西并且原始的 **cn2 没有被释放?以前有其他人遇到过这个问题吗?真是奇怪...使用 new 分配时,我是否必须将它们写在一行而不是 2 行中?

阻止编码以避免此类错误

指针初始化是必须的

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

调试技术:-

使用可视化工作室查找与内存相关的错误 缓冲区溢出说明

使用诊断工具

Vld 和平行工作室