ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-09-15 16:05:40  阅读:236  来源: 互联网

标签:c reference c-faq


我觉得这有点主观;我不确定这个意见是否会一致(我已经看过很多代码片段,其中返回了引用).

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

这让我很担心,因为我跟随了一些例子(除非我想象事情)并且在相当多的地方做过这样的事情……我误解了吗?这是邪恶的吗?如果是这样,那有多邪恶?

我觉得因为我的指针和引用混合在一起,再加上我是C的新手,以及对什么时候使用的混淆,我的应用程序必须是内存泄漏地狱……

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

解决方法:

通常,返回引用是完全正常的并且始终发生.

如果你的意思是:

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

这就是种种邪恶.堆栈分配我将消失,你指的是什么.这也是邪恶的:

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;
}

如果生命周期应该留给调用者,而你只是计算值.

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

标签:c,reference,c-faq
来源: https://codeday.me/bug/20190915/1805371.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有