是否返回一个C ++参考变量的做法,邪恶?

我认为这有点主观; 我不确定意见是否一致(我已经看到很多代码片断,其中引用被返回)。

根据对这个问题的评论,我刚才问到,关于初始化引用,返回引用可能是邪恶的,因为[据我所知],它更容易错过删除它,这可能导致内存泄漏。

这令我感到担忧,因为我遵循例子(除非我在想象事物),并且在少数几个地方做过这些事情......我误解了吗? 它是邪恶的吗? 如果是这样,多么邪恶?

我觉得因为我的指针和引用混杂在一起,加上我是C ++的新手,并且总是对什么时候使用混淆,我的应用程序必须是内存泄漏地狱......

此外,我明白使用智能/共享指针通常被认为是避免内存泄漏的最佳方法。


一般来说,返回一个参考是完全正常的,并且一直发生。

如果你的意思是:

int& getInt() {
    int i;
    return i;  // DON'T DO THIS.
}

这是各种各样的邪恶。 分配给i的堆栈将会消失,而你没有提到任何东西。 这也是邪恶的:

int& getInt() {
    int* i = new int;
    return *i;  // DON'T DO THIS.
}

因为现在客户必须最终做出奇怪的事情:

int& myInt = getInt(); // note the &, we cannot lose this reference!
delete &myInt;         // must delete...totally weird and  evil

int oops = getInt(); 
delete &oops; // undefined behavior, we're wrongly deleting a copy, not the original

请注意,右值引用仍然是引用,所以所有邪恶的应用程序保持不变。

如果你想分配一些超出函数范围的东西,可以使用智能指针(或者一般的容器):

std::unique_ptr<int> getInt() {
    return std::make_unique<int>(0);
}

现在客户端存储一个智能指针:

std::unique_ptr<int> x = getInt();

参考资料也可以用于访问您知道寿命在更高级别保持开放的事物,例如:

struct immutableint {
    immutableint(int i) : i_(i) {}

    const int& get() const { return i_; }
private:
    int i_;
};

在这里我们知道可以返回一个对i_的引用,因为无论调用我们管理类实例的生命周期,所以i_至少会活到那么久。

当然,没有错只是:

int getInt() {
   return 0;
}

如果生命期应该留给呼叫者,并且你只是计算价值。

总结:如果对象的生命周期在调用之后不会结束,那么返回一个引用也是可以的。


不,不,不,千次不。

什么是邪恶是引用一个动态分配的对象并丢失原始指针。 当你new一个对象时,你承担了一个有保证delete的义务。

但是看一下,例如operator<< :必须返回一个引用,或者

cout << "foo" << "bar" << "bletch" << endl ;

将无法工作。


您应该返回一个对现有对象的引用,该对象不会立即消失,并且您不希望传输所有权。

永远不要将引用返回到局部变量或其他类型的引用,因为它不会被引用。

你可以返回一个独立于函数的引用,你不希望调用函数负责删除。 典型的operator[]函数就是这种情况。

如果你正在创建一些东西,你应该返回一个值或一个指针(普通或智能)。 您可以自由地返回一个值,因为它将进入调用函数中的变量或表达式。 切勿将指针返回到局部变量,因为它将消失。

链接地址: http://www.djcxy.com/p/36327.html

上一篇: Is the practice of returning a C++ reference variable, evil?

下一篇: Break indentation for nested loop