c++ - 使用 shared_ptrs 时返回引用

标签 c++ boost reference shared-ptr

假设我有一个相当大的类 Matrix,并且我重载了 operator== 来检查相等性,如下所示:

bool operator==(Matrix &a, Matrix &b);

当然,我通过引用传递 Matrix 对象,因为它们太大了。

现在我有一个方法 Matrix::inverse() 可以返回一个新的 Matrix 对象。现在我想在比较中直接使用逆函数,如下所示:

if (a.inverse()==b) { ... }`

问题是,这意味着逆向方法需要返回对 Matrix 对象的引用。两个问题:

  1. 因为我只是在这次比较中使用了那个引用,这是内存泄漏吗?

  2. 如果 inverse() 方法中的待返回对象属于 boost::shared_ptr 会怎样?方法一退出,shared_ptr 就被销毁,对象不再有效。有没有办法返回对属于 shared_ptr 的对象的引用?

最佳答案

您不需要从 inverse() 方法返回引用。返回对象本身。编译器将创建一个临时引用以传递给相等运算符,并且该引用将在运算符返回后立即超出范围。


回答你的问题是否是内存泄漏。

取决于您要从哪里获取要从 inverse() 返回的对象。如果您要返回对分配在堆上的对象的引用,如下所示:

    Matrix& inverse()
    {
        Matrix* m = new Matrix();
        return *m;
    }

那么这绝对是一个漏洞。事实上,你永远不会释放那段内存,是吗? 如果您要返回对堆栈分配对象的引用,如下所示:

    Matrix& inverse()
    {
        Matrix m;
        return m;
    }

那么我不会说这是泄漏...而是崩溃。一般保护错误,如果你愿意的话。或者内存损坏。或者是噩梦中的其他东西。不要这样做。曾经。 当函数返回时,像这样的堆栈分配对象超出范围,并且回收该内存。但更糟糕的是,为了调用其他函数并分配这些函数的局部变量,它被回收了。因此,如果您保留对堆栈分配对象的引用,那么您就完蛋了。

最后,您可以为该矩阵使用某种自定义存储,如下所示:

    static Matrix _inversed;

    Matrix& inverse()
    {
        _inversed = ...
        return _inversed;
    }

从技术上讲,这不会构成泄漏或崩溃。但你真的也不想这样做,因为从 inverse() 方法的签名中并不清楚它实际上返回了对共享实例的引用,这将使它变得太容易了忘记这一点,摆弄那些“逆”矩阵,搞砸你的数据。

关于c++ - 使用 shared_ptrs 时返回引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2707133/

相关文章:

c++ - Bison/Flex Concat 字符 *

c++ - 检查两个 Boost.MPL 序列是否以任何顺序包含相同的类型

c++ - 本着 boost spirit ,将 multi_pass 与流文件输入一起使用,这是迭代器需要的

c++ - 指向导致问题的 std::promise 的指针

c++ - C++ 可执行文件 : While loop and If/Else If/Else 的问题

c++ - 不创建 getter 的不可变成员变量?

c++ - boost::posix_time::time_input_facet 可以处理非标准的小数秒分隔符吗?

c++ - 通过引用捕获异常

java - 将对象存储在列表中,然后对该对象进行更改

C++ 3D 矩阵使用引用