我正在努力进行一项大型数值分析计划,我几乎不需要优化记忆。
在我的程序中,我需要计算一个矩阵,然后在某些函数中使用它。我们调用矩阵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函数。 通过这种方式,我可以看到内存被分配和删除。但是一旦进入函数,我就可以看到分配,但绝不会看到交易。
答案 0 :(得分:5)
似乎信息太少,无法说明您的代码无效。
也许它在未显示的代码中。
但你可以使用一个可以保证工作的结构。
而不是
double** f=getF(someparams,winSize);
DO
std::vector<double> f( winSize*winSize );
然后代替
f[y][x]
DO
f[y*winSize + x]
当然你可以定义一个函数来做索引
当然你可以将它包装在矩阵类
中但实际上,这是让事情发挥作用的一种方式:)
请注意std::vector
负责分配和解除分配,如果需要,也可以调整大小和复制