返回地址或局部变量或临时C++警告

lim*_*lim 14 c++ warnings

可能重复:
c ++警告:局部变量的地址

嗨,当我写这段代码时:

//Returns the transpose matrix of this one
SparseMatrix& SparseMatrix::transpose()const{
    vector<Element> result;
    size_t i;
    for(i=0;i<_matrix.size();++i){
        result.push_back(Element(_matrix.at(i)._col, _matrix.at(i)._row, _matrix.at(i)._val));
    }

    return SparseMatrix(numCol,numRow,result);
}
Run Code Online (Sandbox Code Playgroud)

我收到警告"返回地址或本地变量或临时".最后一行调用SparseMatrix构造函数.我不明白这段代码有什么问题,我怎么能修复它所以我可以按照自己的意愿返回一个SparseMatrix对象.

Ric*_*dle 14

你要返回一个引用,而不是一个实际的对象 - 注意&这里:

SparseMatrix& SparseMatrix::transpose()const{
Run Code Online (Sandbox Code Playgroud)

如果要返回实际对象,请将其删除&.

最后一行确实调用了构造函数,但它不返回结果对象.该对象立即被销毁,并返回对它的无效引用.

  • +1"&"在这里是无用的(实际上是错误的)! (2认同)

xto*_*ofl 11

在C++中,当超出范围时,局部变量被"自动"破坏.您的return语句将创建一个无名的临时变量,SparseMatrix该变量将立即超出范围.因此,返回对它的引用是没有意义的.

按值返回可能更容易:然后将返回临时副本.编译器可以优化它(复制省略).

如果你真的想要从函数中传递一个对象,你应该在堆上创建它,使用new:

SparseMatrix* SparseMartix::transopse()const{


     //...
     return new SparseMatrix(...);

}
Run Code Online (Sandbox Code Playgroud)

但是,您需要自己处理返回对象的生命周期.