内存分配和功能内部删除

时间:2013-02-21 08:46:58

标签: c++ memory-management memory-leaks

我正在努力进行一项大型数值分析计划,我几乎不需要优化记忆。

在我的程序中,我需要计算一个矩阵,然后在某些函数中使用它。我们调用矩阵ffwinSize 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函数。 通过这种方式,我可以看到内存被分配和删除。但是一旦进入函数,我就可以看到分配,但绝不会看到交易。

1 个答案:

答案 0 :(得分:5)

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

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

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

而不是

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

DO

std::vector<double> f( winSize*winSize );

然后代替

f[y][x]

DO

f[y*winSize + x]

当然你可以定义一个函数来做索引

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

但实际上,这是让事情发挥作用的一种方式:)

请注意std::vector负责分配和解除分配,如果需要,也可以调整大小和复制