C4172和C4239返回局部变量

时间:2014-03-25 21:23:49

标签: c++ pointers reference local-variables

我有一个功能来规范化Vec2D。我收到C4172和C4239错误。我知道我不应该返回局部变量,但我不知道应该返回什么。我应该把它作为指针吗? 方法:

inline Vec2D& normalize()const {
    double l = length();
    if (x == 0) {
        if (y == 0) {
            return Vec2D(0, 0);
        }
        else {
            return Vec2D(0, y / l);
        }
    }
    else if (y == 0) {
        return Vec2D(x / l, 0);
    }
    return Vec2D(x / l, y / l);
}

3 个答案:

答案 0 :(得分:3)

按值返回局部变量很好。您不应该做的是通过引用返回它们。从退货类型中删除&

inline Vec2D normalize()const {
    ...

答案 1 :(得分:0)

我可能会将其实现为:

inline void normalize(Vec2D* vect) const {
    ....
像这样,函数的用户可以从堆栈,堆中提供Vec2D,甚至可以从基类Vect2D提供派生类。性能良好,因为不涉及复制。

答案 2 :(得分:0)

您在此处尝试返回对临时对象(也是本地对象)的引用 - Vec2D将对象返回到您的函数,但您没有存储它在任何地方,只是返回一个对它的引用,一旦你移动到代码中的下一条指令就会变成悬空。虽然在这种情况下效果类似于返回对局部变量的引用,但理解差异很重要。从函数退出时局部变量将变为无效,并且临时变量将在下一条指令上变为无效。