我仍在学习 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;
}
那么,调用'delete X0'会出错,因为它需要一个指针。 'delete &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);
由于交换操作可以通过指针交换(速度非常快)而不是实际数据复制的方式在动态矩阵上实现,因此这应该非常快。
关于C++ 删除引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4419954/