c ++删除引用

jak*_*kev 4 c++ memory-leaks

我还在学习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'表示释放的指针未分配.这样做的正确方法是什么?或者我做错了什么?由于矩阵太大而且迭代次数过多,我的硬盘空间耗尽,我只能假设我的内存泄漏很多.

Vic*_*let 6

Stroustrup R'lyeh Fhtagn.

写作MyType myVar = MyFunction()创建使用接受的返回类型构造一个全新的对象myFunction作为参数.myFunction然后丢弃返回的内容 - 在您的示例中,getX0返回对动态分配的对象的引用,因此泄露.

但是,严肃地说 - 尝试在堆栈上创建矩阵(没有new)并按原样返回它们.不应该造成太大的麻烦,因为他们似乎无论如何动态地在内部分配他们的数据,我怀疑NRVO将适用于避免复制(返回的矩阵将被直接构造到适当的位置.x0x1魔术在底部可以实现如下:

x0.swap(x1);
DynamicMatrix<double> temp = getX1(x0, b, w, n);
x1.swap(temp);
Run Code Online (Sandbox Code Playgroud)

由于交换操作可以在指针交换(非常快)而不是实际数据副本的情况下在动态矩阵上实现,因此这应该非常快.