可能重复:
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)
如果要返回实际对象,请将其删除&.
最后一行确实调用了构造函数,但它不返回结果对象.该对象立即被销毁,并返回对它的无效引用.
xto*_*ofl 11
在C++中,当超出范围时,局部变量被"自动"破坏.您的return语句将创建一个无名的临时变量,SparseMatrix该变量将立即超出范围.因此,返回对它的引用是没有意义的.
按值返回可能更容易:然后将返回临时副本.编译器可以优化它(复制省略).
如果你真的想要从函数中传递一个对象,你应该在堆上创建它,使用new:
SparseMatrix* SparseMartix::transopse()const{
//...
return new SparseMatrix(...);
}
Run Code Online (Sandbox Code Playgroud)
但是,您需要自己处理返回对象的生命周期.