内存分配和功能内部删除

And*_*uri 2 c++ memory-leaks memory-management

我正在努力进行一项大型数值分析计划,我需要优化内存.

在我的程序中,我需要计算一个矩阵,然后在某些函数中使用它.我们称之为矩阵f.fwinSize 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;
}
Run Code Online (Sandbox Code Playgroud)

该计划如下:

int winSize=computeWindowSize();
double** f=getF(someparams,winSize);

hiIamaFunctionThatWantsToReadF(params...,f,winSize);
soIwant(params2...,f,winSize);
iamJustCurious(f,winSize);

freeF(f,winSize)
Run Code Online (Sandbox Code Playgroud)

请注意,没有人修改f,只读它.

我的问题是这不会释放内存.我认为问题在于我处理f的方式,但不确定....

我的问题是:

  • 为什么这不起作用?
  • 我该怎么做才能让它发挥作用?

编辑:

如何检查内存是否未释放?

我必须运行这段代码1000x1400次,并且在几次迭代中程序崩溃,因为我的计算机中没有更多的可用RAM内存......这可能是未释放内存的标志.然后我尝试在OUTSIDE函数中创建内存,然后删除OUTSIDE函数.通过这种方式,我可以看到内存被分配和删除.但是一旦进入函数,我就可以看到分配,但从未看到过分配.

Che*_*Alf 5

似乎信息太少,无法说明您的代码无效.

也许它在未显示的代码中.

但你可以使用一个保证工作的结构.

代替

double** f=getF(someparams,winSize);
Run Code Online (Sandbox Code Playgroud)

std::vector<double> f( winSize*winSize );
Run Code Online (Sandbox Code Playgroud)

而不是

f[y][x]
Run Code Online (Sandbox Code Playgroud)

f[y*winSize + x]
Run Code Online (Sandbox Code Playgroud)

当然,您可以定义一个函数来进行索引

当然,你可以将它包装在矩阵类中

但实际上,这是使事情有效的一种方法:)

请注意,std::vector分配和释放都需要考虑,如果需要,也可以调整大小和复制