函数内部的内存分配和删除
Memory allocation and deletion inside functions
我正在开发一个大型数值分析程序,几乎不需要优化内存。
在我的程序中,有些地方我需要计算一个矩阵,然后在一些函数中使用它。让我们把矩阵称为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内存。。。这可能是内存未释放的迹象。然后我尝试在函数的外部创建内存,然后删除函数的外部。通过这种方式,我可以看到内存被分配和删除。但一旦进入功能,我就可以看到分配,但永远看不到分配。
似乎信息太少,无法说明哪些代码不起作用。
也许它在未显示的代码中。
但是你可以使用一个保证有效的构造。
而不是
double** f=getF(someparams,winSize);
进行
std::vector<double> f( winSize*winSize );
那么代替
f[y][x]
进行
f[y*winSize + x]
当然,你可以定义一个函数来索引
当然,你可以把它包装在矩阵类中
但从本质上讲,这是让事情运转起来的一种方法:)
请注意,std::vector
同时负责分配和解除分配,如果您想要
相关文章:
- 将数组的地址分配给变量并删除
- 在对象指针上调用 Delete 是否会递归删除其动态分配的成员
- 在程序变得低效之前,允许多少新的[]和删除[]分配是否有限制?
- 动态分配列表 - 创建一个函数,用于删除所有包含偶数值的元素
- 如何在C++中为增加但记住删除先前对象的对象分配唯一标识符
- 删除分配的 (?) 指针时"Pointer being freed was not allocated"
- 如何在析构函数中删除C++中动态分配的数组?
- 无法删除布尔动态内存分配
- 为什么删除分配的阵列会导致内存错误?
- 使用卷曲支架从堆栈中删除分配
- 破坏者未删除分配的内存
- 有没有一种方法可以全局填充新分配/删除分配
- 函数返回后,如何删除分配的变量
- 如何删除分配了新的对象
- 将指针移动到其他位置后删除分配的内存
- 创建新的 CMFCDesktopAlertWnd 时,何时删除分配的内存
- 假设规则和删除分配
- 分配内存,并在删除分配之前定义NULL
- 删除分配给对象的所有内存
- 在删除分配的内存时调试断言失败