首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >返回C++引用变量的做法是邪恶的吗?

返回C++引用变量的做法是邪恶的吗?
EN

Stack Overflow用户
提问于 2009-04-16 00:49:50
回答 16查看 332.8K关注 0票数 375

我认为这有点主观;我不确定是否会有一致的意见(我已经看到了很多返回引用的代码片段)。

根据对this question I just asked, regarding initializing references的评论,返回引用可能是邪恶的,因为据我所知,它更容易错过删除它,这可能会导致内存泄漏。

这让我很担心,因为我遵循了示例(除非我是在想象),并在相当多的地方做到了这一点……我是不是误解了?它是邪恶的吗?如果是这样的话,到底有多邪恶?

我觉得,由于我的指针和引用混杂在一起,再加上我是C++新手,而且完全不知道什么时候使用什么,我的应用程序肯定是内存泄漏地狱……

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

EN

回答 16

Stack Overflow用户

回答已采纳

发布于 2009-04-15 16:58:32

一般来说,返回一个引用是非常正常的,并且经常发生。

如果你的意思是:

代码语言:javascript
复制
int& getInt() {
    int i;
    return i;  // DON'T DO THIS.
}

这是各种各样的邪恶。堆栈分配的i将消失,而您指的是什么也没有。这也是邪恶的:

代码语言:javascript
复制
int& getInt() {
    int* i = new int;
    return *i;  // DON'T DO THIS.
}

因为现在客户端最终不得不做一些奇怪的事情:

代码语言:javascript
复制
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

请注意,右值引用仍然只是引用,因此所有恶意应用程序都保持不变。

如果要分配超出函数作用域的内容,请使用智能指针(通常是容器):

代码语言:javascript
复制
std::unique_ptr<int> getInt() {
    return std::make_unique<int>(0);
}

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

代码语言:javascript
复制
std::unique_ptr<int> x = getInt();

引用也可以用于访问你知道生命周期在更高级别上保持开放的事物,例如:

代码语言:javascript
复制
struct immutableint {
    immutableint(int i) : i_(i) {}

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

在这里,我们知道返回对i_的引用是可以的,因为无论调用我们什么,都会管理类实例的生命周期,所以i_至少会存在这么长时间。

当然,仅仅是这样没有什么错:

代码语言:javascript
复制
int getInt() {
   return 0;
}

如果生命周期应该由调用者决定,而您只是在计算该值。

摘要:如果对象的生命周期不会在调用后结束,则可以返回引用。

票数 460
EN

Stack Overflow用户

发布于 2009-04-15 16:52:34

不是的。不,不,一千次都不是。

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

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

代码语言:javascript
复制
cout << "foo" << "bar" << "bletch" << endl ;

行不通的。

票数 66
EN

Stack Overflow用户

发布于 2009-04-15 19:39:29

您应该返回一个对现有对象的引用,该对象不会立即消失,并且您不打算进行任何所有权转移。

永远不要返回对局部变量或类似变量的引用,因为它不会被引用。

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

如果你正在创建一些东西,你应该返回值或指针(常规的或智能的)。您可以自由地返回值,因为它将进入调用函数中的变量或表达式。永远不要返回指向局部变量的指针,因为它会消失。

票数 58
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/752658

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档