And*_*uri 2 c++ memory-leaks memory-management
我正在努力进行一项大型数值分析计划,我需要优化内存.
在我的程序中,我需要计算一个矩阵,然后在某些函数中使用它.我们称之为矩阵f.f是winSize x winSize一个在f创建之前计算的变量.
我有几个功能,这是重要的功能:
double** getF(some params to get f,int winSize){
    double** f=new double*[winSize];
    for(int i=0;i<winSize;i++)
         f[i]=new double[winSize];
    /* 
    Some stuff to fill f
    */
}
void freeF(double** f,int winSize){
     for(int i=0;i<winSize;i++)
         delete [] f[i];
     delete [] f;
}
该计划如下:
int winSize=computeWindowSize();
double** f=getF(someparams,winSize);
hiIamaFunctionThatWantsToReadF(params...,f,winSize);
soIwant(params2...,f,winSize);
iamJustCurious(f,winSize);
freeF(f,winSize)
请注意,没有人修改f,只读它.
我的问题是这不会释放内存.我认为问题在于我处理f的方式,但不确定....
我的问题是:
编辑:
如何检查内存是否未释放?
我必须运行这段代码1000x1400次,并且在几次迭代中程序崩溃,因为我的计算机中没有更多的可用RAM内存......这可能是未释放内存的标志.然后我尝试在OUTSIDE函数中创建内存,然后删除OUTSIDE函数.通过这种方式,我可以看到内存被分配和删除.但是一旦进入函数,我就可以看到分配,但从未看到过分配.
似乎信息太少,无法说明您的代码无效.
也许它在未显示的代码中.
但你可以使用一个保证工作的结构.
代替
double** f=getF(someparams,winSize);
做
std::vector<double> f( winSize*winSize );
而不是
f[y][x]
做
f[y*winSize + x]
当然,您可以定义一个函数来进行索引
当然,你可以将它包装在矩阵类中
但实际上,这是使事情有效的一种方法:)
请注意,std::vector分配和释放都需要考虑,如果需要,也可以调整大小和复制