我还在学习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);
}
Run Code Online (Sandbox Code Playgroud)
每个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;
}
Run Code Online (Sandbox Code Playgroud)
那么,调用'删除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);
Run Code Online (Sandbox Code Playgroud)
由于交换操作可以在指针交换(非常快)而不是实际数据副本的情况下在动态矩阵上实现,因此这应该非常快.