0

众所周知,由于作用域,从 C++ 中的函数返回局部变量是不安全的。在 Effective C++ 第三版中,Scott Meyers 在第 101 页的第 21 项中讲述了这个问题。然而,他总结说,正确的决定是这样写:

inline const Rational operator*(const Rational& lhs, const Rational& rhs) {
    return Rational(lhs.n * rhs.h, lhs.d * rhs.d);
}

这不也是一种不好的做法,而且这个功能是不安全的吗?

UPD:谢谢大家的解释。

4

4 回答 4

8

从函数返回局部变量是正常的,没有错。返回指针或对局部变量的引用是不同的故事,但在您的示例中没有任何类型。

于 2014-07-16T20:26:36.793 回答
7

您实际上不能返回局部变量。您可以返回局部变量的、指向它的指针(即它的地址)或对它的引用。

返回局部变量的是非常安全的:

int good_func() {
    int local = 42;
    return local; // returns a copy of the value of "local"
}

返回局部变量的指针引用是不安全的,因为当函数终止时变量不再存在:

int* bad_func() {
    int local = 42;
    return &local; // returns a pointer to "local"
}

(这同样适用于 C,除了 C 没有 C++ 样式的引用。)

于 2014-07-16T20:27:07.487 回答
2

不,这不是不安全的,因为Rational它是按值返回的。这意味着调用者将获得您创建的副本Rational这使得整个过程安全。

返回对局部变量的引用或通过引用访问超出范围的对象是不安全的。但是,这不是代码示例中发生的情况。

请注意,可以在不复制的情况下创建副本,这可能会降低性能。这是因为 C++ 编译器可以使用此处描述的返回值优化技术。

于 2014-07-16T20:27:21.513 回答
0

不,这不是不安全的,您是按值返回的,即使在 C++98 中它也是安全的,但在 C++98 中可能不够快,因为额外的不必要的复制(在 C++11 中使用 Move Semantic 避免复制)。然而,许多 C++ 大师不建议将它用于大对象。大对象的问题在于,移动可能会在对象的某些数据成员中衰减为副本。

于 2014-07-16T20:28:00.980 回答