2

我正在编写一个大型数值分析程序,我几乎不需要优化内存。

在我的程序中,有些地方我需要计算一个矩阵,然后在某些函数中使用它。我们称之为矩阵ff是,一个在创建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 内存......这可能是未释放内存的标志。然后我尝试在函数外创建内存,然后在函数外删除。通过这种方式,我可以看到内存被分配和删除。但是一旦在函数内部,我可以看到分配,但看不到释放。

4

1 回答 1

5

似乎信息太少,无法说明您的代码不起作用。

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

但是您可以只使用保证工作的构造。

代替

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

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

然后代替

f[y][x]

f[y*winSize + x]

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

当然你可以把它包装在一个矩阵类中

但本质上,这是让事情顺利进行的一种方法:)

请注意,它std::vector负责分配和释放,如果您愿意,它也可以调整大小和复制

于 2013-02-21T08:51:20.033 回答