C++ 删除引用

标签 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);
}

每个 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/

相关文章:

c++ - 使用 const T & 和 T&& 两种类型的参数实现一个函数

c++ - 最佳实践 - 应该在哪里定义类的 const 数据

带有字符串的 Python 内存泄漏

objective-c - 如何释放保留对象的内存

c - 使用无效命令的 fork 导致 valgrind 中的内存泄漏

c - fork多线程进程,为线程分配内存

java - 无法使用 LeakCanary 监视 fragment (ClassCastException 错误)

c++ - boost::asio::io_context::run_one_for() 无法发送大缓冲区

c++ - 无法将 'void (MyClass::*)()' 转换为 'void (*)()

c++ - Boost Multi-Index 的上限