C++ 如何从成员函数返回对新对象实例的引用(在某些操作之后)?

C++ 如何从成员函数返回对新对象实例的引用(在某些操作之后)?,c++,function,class,constants,C++,Function,Class,Constants,我正在尝试创建一个矩阵类“ECE_Matrix”。它将采用常数ECE_矩阵并执行所有一般操作。这些操作不应更改传递的实例 对于转置,我试图返回对成员函数内新转置Mat实例的引用。然而,我得到了坏的错误。但它在同一个代码中运行了好几次,我感到困惑。我还尝试将同样的想法扩展到加法运算符重载和链接 我不想返回this指针,因为成员函数应该是const。我想在member函数中创建一个新实例,并将对该新成员的引用作为输出返回。我现在在做这个, const ECE_Matrix& tran

我正在尝试创建一个矩阵类“ECE_Matrix”。它将采用常数ECE_矩阵并执行所有一般操作。这些操作不应更改传递的实例

对于转置,我试图返回对成员函数内新转置Mat实例的引用。然而,我得到了坏的错误。但它在同一个代码中运行了好几次,我感到困惑。我还尝试将同样的想法扩展到加法运算符重载和链接

我不想返回this指针,因为成员函数应该是const。我想在member函数中创建一个新实例,并将对该新成员的引用作为输出返回。我现在在做这个,

    const ECE_Matrix& transpose() const
{
    ECE_Matrix M(m_col, m_row, 0);

    std::vector<std::vector<double> > t_matrix( m_col, std::vector<double>(m_row, 0));

    for (int i=0; i < m_row; ++i)
    {
        for (int j=0; j < m_col; ++j)
            {
                t_matrix[j][i] = m_matrix[i][j];
            }
    }

    M.setMatrix(t_matrix);
    const ECE_Matrix* mp = &M;
    return *mp;

}
重载函数调用operation函数,通过以下函数返回对求和ECE_矩阵实例的引用

我在计算函数中两个矩阵的和:

 const ECE_Matrix& operation(const ECE_Matrix &M1, const ECE_Matrix &M2, Operator opType) const

    ......CODE to calculate SUm.....

    const ECE_Matrix* mp = &M; // M is of type ECE_Matrix whose member variable holds sum.
                return *mp;
即使*mp正确地指向求和的实例,在返回它之后,重载函数中的结果_矩阵也不会得到中*mp所指的实例:

const ECE_Matrix ResultMatrix = operation(*this, M2, ADD);
发生了什么事?是不是有“this”指针?

下一行

  return *mp;

在文章的代码段末尾创建一个悬空指针,正如文章的前两条注释所指出的那样。正如@NathanOliver所指出的,我最终解决了按值返回的问题,同时使用const ref作为输入。

或者,您可以在方法中创建ECE_矩阵类的新实例,如下所示:

ECE_Matrix M = new ECE_Matrix(m_col, m_row, 0);

问题是您将该指针的所有权转移到调用函数,这可能会导致混淆,并且经常(尤其是在较大的项目中)导致内存泄漏。

return*mp返回对函数完成时超出范围的局部变量的引用->它成为悬挂引用为什么要返回引用?函数返回后,对局部变量的引用立即挂起。你应该按值返回。如果你按常量引用,并按值返回,你仍然可以不带任何UB@Rio1210按值返回应该有效。你能发布你失败的尝试吗?@rio1210它之所以有效,是因为按常量引用可以捕获临时值,而按值返回时所拥有的就是wick。非常量引用无法绑定到临时变量,因此您必须在原始代码中通过引用返回。请详细说明这是如何工作的?如何通过此方法将计算返回给调用函数?谢谢。它将在堆上创建ECE_Matrix类的一个新实例(而不是堆栈上的一个变量,该变量在函数完成时超出作用域)。您将返回指向ECE_矩阵新实例的指针。ECE_矩阵的实例将一直存在,直到您将其删除或应用程序退出。
ECE_Matrix M = new ECE_Matrix(m_col, m_row, 0);