我认为这有点主观;我不确定意见是否一致(我见过许多返回引用的代码片段)。

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

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

我觉得因为我的指针和引用的混合包,加上我是c++的新手,以及完全不知道什么时候用什么,我的应用程序一定是内存泄漏的地狱…

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


当前回答

“回复推荐信是邪恶的,因为, 只是(据我所知)它造就了它 更容易忘记删除它”

不正确的。返回引用并不意味着所有权语义。也就是说,只是因为你这样做:

Value& v = thing->getTheValue();

...并不意味着你现在拥有由v引用的内存;

然而,这是可怕的代码:

int& getTheValue()
{
   return *new int;
}

如果你这样做是因为“你不需要那个实例上的指针”,那么:1)如果你需要引用,就解除对指针的引用,2)你最终会需要指针,因为你必须用delete匹配new,你需要一个指针来调用delete。

其他回答

对已接受答案的补充:

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!

这并不邪恶。像c++中的许多东西一样,如果使用正确,它是好的,但在使用它时应该注意许多陷阱(比如返回对局部变量的引用)。

有一些好的东西可以用它来实现(比如map[name] = "hello world")

返回引用通常用于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;
 }

通过这种方式,您可以安全地使用返回引用。

但你总是可以使用指针而不是引用在函数中返回值。

函数作为左值(也就是返回非const引用)应该从c++中删除。这太不直观了。Scott Meyers想要一个min()的行为。

min(a,b) = 0;  // What???

这并不是真正的进步

setmin (a, b, 0);

后者甚至更有意义。

我意识到函数作为左值对于c++风格的流很重要,但值得指出的是,c++风格的流很糟糕。我不是唯一一个这样认为的人……我记得Alexandrescu有一篇关于如何做得更好的文章,我相信boost也试图创建一个更好的类型安全的I/O方法。

“回复推荐信是邪恶的,因为, 只是(据我所知)它造就了它 更容易忘记删除它”

不正确的。返回引用并不意味着所有权语义。也就是说,只是因为你这样做:

Value& v = thing->getTheValue();

...并不意味着你现在拥有由v引用的内存;

然而,这是可怕的代码:

int& getTheValue()
{
   return *new int;
}

如果你这样做是因为“你不需要那个实例上的指针”,那么:1)如果你需要引用,就解除对指针的引用,2)你最终会需要指针,因为你必须用delete匹配new,你需要一个指针来调用delete。