函数内部的内存分配和删除

Memory allocation and deletion inside functions

本文关键字:删除 分配 内存 内部 函数      更新时间:2023-10-16

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

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

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

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

但是你可以使用一个保证有效的构造。

而不是

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

进行

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

那么代替

f[y][x]

进行

f[y*winSize + x]

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

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

但从本质上讲,这是让事情运转起来的一种方法:)

请注意,std::vector同时负责分配和解除分配,如果您想要

,也可以调整其大小并进行复制