注意:最初我虽然有一部分代码导致泄漏,但结果证明是错误的。因此下面的评论。我已更新了问题
可能的解决方案: 我设法解决了这个问题。我所做的是将所有初始化移动到函数的头部。当我看到相应的删除代码时,将它们列在一张纸上并刮掉它们。这条路 我没有错过任何删除 2.确保我没有初始化循环内的任何内容 管理消除除了几个字节的泄漏。 更新的代码:http://sharetext.org/gPJf 您可以在下面找到“之前”代码:
我面临错误的功能就是这个: http://sharetext.org/3gq0
从我收集的评论中,初始化和删除可能不正确。这是负责品尝的代码
float** CMemAlloc::init_2Dfloat(int rows,int cols)
{
float **a;
a=new float*[rows];
for(int j=0;j<rows;j++)
a[j]=new float[cols];
for(int i=0;i<rows;i++)
for(int j=0;j<cols;j++)
a[i][j]=0.0;
return a;
}
void CMemAlloc::del_float(float **a,int rows)
{
if(a!=NULL)
{
for (int i = 0; i <rows; i++) {
delete[] a[i];
a[i] = NULL;
}
delete[] a;
a=NULL;
}
else
{
return;
}
}
我怀疑这个功能对出现故障:
CCoarseFun::window** CCoarseFun::init_2Dwin(int rows,int cols)
{
window** a;
a=new window*[rows];
for(int j=0;j<rows;j++)
a[j]=new window[cols];
for(int i=0;i<rows;i++)
{
for(int j=0;j<cols;j++)
{
a[i][j].line_high=0;
a[i][j].line_low=0;
a[i][j].pixel_high=0;
a[i][j].pixel_low=0;
}
}
return a;
}
void CCoarseFun::del_win(window ** a, int rows)
{
for(int i=0;i<rows;i++)
{
delete [] a[i];
a[i] = NULL;
}
delete[] a;
a=NULL;
}
这里可能有错误吗?
注意:我已在各个点放置跟踪语句并打印“块”的地址。输出结果如下:http://sharetext.org/ODSv
我目前正在尝试从内部循环中删除所有初始化。
答案 0 :(得分:0)
我认为你的问题不是指针,而是引用,你使用双指针分配2D数组,并在你的代码中:
void CCoarseFun::del_win(window ** a, int rows)
window
不是由指针传递的,它是一个通过值传递的指针
要解决此问题,您只需通过引用传递它,
void CCoarseFun::del_win(window ** &a, int rows)
这里也是..
void CMemAlloc::del_float(float ** &a,int rows)
在你的代码中,一切都很顺利,但是当你执行CCoarseFun::del_win(a,rows);
时,它将取消分配内存但不会被取消,因为它在代码中作为副本传递