返回地址或局部变量或临时C++警告[重复]

问题描述 投票:0回答:3

可能重复:
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);
}

我收到警告“返回地址或局部变量或临时变量”。最后一行调用 SparseMatrix 构造函数。我不明白这段代码有什么问题,以及如何修复它以便我可以根据需要返回 SparseMatrix 对象。

c++ warnings
3个回答
17
投票

您返回的是引用,而不是实际对象 - 请注意此处的

&

SparseMatrix& SparseMatrix::transpose()const{

如果您想返回实际对象,请删除该对象

&

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


13
投票

在 C++ 中,局部变量在超出范围时会“自动”被破坏。您的

return
语句将创建一个
SparseMatrix
类型的无名临时变量,该变量将立即超出范围。因此,返回对它的引用是没有意义的。

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

如果你确实想从函数中传递一个对象,你应该使用

new
:

在堆上创建它
SparseMatrix* SparseMatrix::transpose()const{

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

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


0
投票

构造“T()”创建一个“T”类型的临时值,它基本上不是左值(而是右值)。

$12.1/11 - “函数符号类型 转换(5.2.3)可用于 创建其类型的新对象。 [ 注意:语法看起来像 显式调用构造函数。

12 以这种方式创建的对象是未命名的。 [注:12.2描述了>临时对象的生命周期。 -结尾 note ] [ 注意:显式构造函数调用不会产生左值,请参见 3.10。 ——尾注] 该临时变量的生命周期是完整表达式的末尾,即表达式后面的结束分号。

$12.2/3 - “临时对象是 作为最后一步被摧毁 评估完整表达式 (1.9) (词汇上)包含点 他们被创造的地方。这是真实的 即使评估结果是 抛出异常。价值 的计算和副作用 销毁临时对象是 仅与 完整表达,不带任何具体内容 子表达式。”

$12.2/5-“临时工的一生 绑定到 a 中的返回值 函数返回语句(6.6.3)是 未延长;暂时的是 于年底被摧毁 返回中的完整表达式 声明。”

因此,您的函数尝试返回对存储持续时间已结束且对象已被销毁的内存位置的引用。

因此发出警告。请注意,这种情况不需要由标准明确诊断,因此需要发出警告。

© www.soinside.com 2019 - 2024. All rights reserved.