【发布时间】:2009-04-08 17:07:10
【问题描述】:
大家好,
我相信下面这段代码会产生内存泄漏?
/* External function to dynamically allocate a vector */
template <class T>
T *dvector(int n){
T *v;
v = (T *)malloc(n*sizeof(T));
return v;
}
/* Function that calls DVECTOR and, after computation, frees it */
void DiscontinuousGalerkin_Domain::computeFaceInviscidFluxes(){
int e,f,n,p;
double *Left_Conserved;
Left_Conserved = dvector<double>(NumberOfProperties);
//do stuff with Left_Conserved
//
free(Left_Conserved);
return;
}
我认为,通过将指针传递给 DVECTOR,它会分配它并返回正确的地址,以便 free(Left_Conserved) 成功解除分配。但是,似乎并非如此。
注意:我还测试了 new/delete 替换 malloc/free 也没有成功。
我有一段用于分配二维数组的类似代码。我决定像这样管理向量/数组,因为我经常使用它们,而且我还想更深入地了解 C++ 的内存管理。
所以,我很想保留一个外部函数来为我分配向量和数组。有什么办法可以避免内存泄漏?
编辑
我也一直在使用 DVECTOR 函数来分配用户定义的类型,所以我猜这可能是个问题,因为我没有调用构造函数。
即使在我释放 Left_Conserved 向量之前的代码段中,我也想以其他方式分配一个向量并将其“打开”以供其他函数通过其指针进行评估。如果使用 BOOST,它会在函数结束时自动清理分配,所以,我不会用 BOOST 获得“公共”数组,对吧?我想这很容易用 NEW 解决,但是对于矩阵来说,更好的方法是什么?
我刚刚想到我将指针作为参数传递给其他函数。现在,BOOST 似乎不太喜欢它,编译退出并出现错误。
所以,我仍然需要一个指向向量或矩阵的指针,它接受用户定义的类型,将作为参数传递给其他函数。向量(或矩阵)很可能在外部函数中分配,并在另一个合适的函数中释放。 (我只是不想复制循环和新的东西来在代码中的任何地方分配矩阵!)
这是我想做的:
template <class T>
T **dmatrix(int m, int n){
T **A;
A = (T **)malloc(m*sizeof(T *));
A[0] = (T *)malloc(m*n*sizeof(T));
for(int i=1;i<m;i++){
A[i] = A[i-1]+n;
}
return A;
}
void Element::setElement(int Ptot, int Qtot){
double **MassMatrix;
MassMatrix = dmatrix<myT>(Ptot,Qtot);
FillInTheMatrix(MassMatrix);
return;
}
【问题讨论】:
标签: c++ memory-leaks