我认为这有点主观;我不确定意见是否一致(我见过许多返回引用的代码片段)。
根据对我刚才问的这个问题的评论,关于初始化引用,返回一个引用可能是邪恶的,因为(据我所知)它更容易错过删除它,这可能导致内存泄漏。
这让我很担心,因为我已经遵循了一些例子(除非是我想象的事情),并且在相当多的地方这样做了……我误解了吗?它邪恶吗?如果是的话,到底有多邪恶?
我觉得因为我的指针和引用的混合包,加上我是c++的新手,以及完全不知道什么时候用什么,我的应用程序一定是内存泄漏的地狱…
另外,我知道使用智能/共享指针被普遍认为是避免内存泄漏的最佳方法。
返回引用通常用于c++中大型对象的操作符重载,因为返回值需要复制操作。(在操作符重载中,我们通常不使用指针作为返回值)
但是返回引用可能会导致内存分配问题。由于对结果的引用将作为对返回值的引用传递给函数,因此返回值不能是自动变量。
如果你想使用返回引用,你可以使用静态对象的缓冲区。
例如
const max_tmp=5;
Obj& get_tmp()
{
static int buf=0;
static Obj Buf[max_tmp];
if(buf==max_tmp) buf=0;
return Buf[buf++];
}
Obj& operator+(const Obj& o1, const Obj& o1)
{
Obj& res=get_tmp();
// +operation
return res;
}
通过这种方式,您可以安全地使用返回引用。
但你总是可以使用指针而不是引用在函数中返回值。
对已接受答案的补充:
Struct immutableint {
Immutableint (int i): i_(i) {}
Const int& get() Const{返回i_;}
私人:
int i_;
};
我认为这个例子是不好的,如果可能的话应该避免。为什么?很容易以悬空引用结束。
用一个例子来说明这一点:
struct Foo
{
Foo(int i = 42) : boo_(i) {}
immutableint boo()
{
return boo_;
}
private:
immutableint boo_;
};
进入危险区域:
Foo foo;
const int& dangling = foo.boo().get(); // dangling reference!