是返回一个C引用变量的做法吗?

这是一个主观我认为;我不知道这个意见是否会一致(我看到很多代码片段返回引用)。

根据对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;
}

如果生命周期应该留给调用者,并且你只是计算的值。

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

翻译自:https://stackoverflow.com/questions/752658/is-the-practice-of-returning-a-c-reference-variable-evil

转载注明原文:是返回一个C引用变量的做法吗?