我仍在学习c++,并且有一个可能很明显的问题,或者也许我只是不知道我要做什么。我有一些函数,它们采用一个矩阵(我写的一个类,该类具有正确编写的析构函数)并从中创建一个新的矩阵,并返回对新矩阵的引用。我需要在这些矩阵上迭代数以万计,因此我需要确保没有任何内存泄漏。因此,问题是,如何正确删除不再需要的矩阵以便为下一个矩阵腾出空间?这是我试图实现无泄漏的代码:
DynamicMatrix<double> x0 = getX0(n);
DynamicMatrix<double>exactU = getExactU(n);
DynamicMatrix<double> b = getB(n) * w;
DynamicMatrix<double> x1 = getX1(x0, b, w, n);
while( !isConverged(exactU,x1,e) ){
delete x0; //<<<<< This doesn't work. Nor does delete &x0.
x0 = x1;
x1 = getX1(x0, b, w, n);
}
每个getX()方法都创建一个指向矩阵的指针,并像getX0()一样返回对矩阵的引用:
DynamicMatrix<double> &getX0(int n){
DynamicMatrix<double>* mat1 = new DynamicMatrix<double>(n * n,1);
for (int i = 1 ; i <= n; i++){
for (int j = 1; j <= n; j++){
mat1->set((i-1)*n +j, 1, 0);
}
}
return *mat1;
}
因此,由于需要指针,因此调用“删除X0”错误。 “删除&X0”表示未分配要释放的指针。正确的方法是什么?还是我做错了什么?由于矩阵太大且迭代次数过多,因此我的大型硬盘空间不足,我只能认为这意味着我的内存泄漏非常丰富。
最佳答案
Stroustrup R'lyeh Fhtagn 。
编写MyType myVar = MyFunction()
会使用接受myFunction
的返回类型作为参数的构造函数创建一个全新的对象。 myFunction
返回的所有内容都将被丢弃-在您的示例中,getX0
返回对动态分配的对象的引用,因此被泄漏。
但是,认真地-尝试在堆栈上创建矩阵(不使用new
),并按原样返回它们。应该不会造成太大的麻烦,因为它们无论如何似乎都是在内部动态分配数据,而且我怀疑NRVO可以避免生成副本(将返回的矩阵直接构造到适当的位置。x0
和x1
魔术底部可以实现如下:
x0.swap(x1);
DynamicMatrix<double> temp = getX1(x0, b, w, n);
x1.swap(temp);
由于可以根据指针交换(非常快)而不是实际的数据副本在动态矩阵上实现交换操作,因此这应该非常快。