对象是临时或匿名返回的,是否会导致内存泄漏?

时间:2015-06-09 20:53:30

标签: c++ dynamic-memory-allocation

首先,当返回一个未命名的对象时,例如:

Object* func() { return new Object(); }

是一个匿名变量,临时变量,两者都不是,或两者兼而有之?让它未命名会导致它是临时的 - 因为一旦func返回它就会超出范围吗?我可以通过将其分配给调用代码块中的指针或引用来扩展其范围,还是非法/危险?

我的第二个担心是因为如果我是这样的话,它是用new创建的:

Object *var = func()

在其他地方,之后我需要delete吗?如果我没有删除它,我认为这会导致内存泄漏。

如果我改为引用:

Object& func() { return new Object(); }

我将新对象分配给指针或引用,访问该对象是非法/危险吗?

另外,如果我在这里缺少任何其他术语,请说明一下。

3 个答案:

答案 0 :(得分:4)

Object* func() { return new Object(); }

这会分配一个带有new的对象(必须使用delete释放,否则会有泄漏)并按值返回指向它的指针。

Object& func() { return new Object(); }

这是非法的。它声称它返回对Object的引用,但new Object返回指向对象的指针。如果我们解决了这个问题:

Object* & func() { return new Object(); }

我们仍有问题 - 这会分配一个带有new的对象,并返回对它的临时指针的引用。这是非法的 - 您无法返回对临时的引用。它与以下内容没有什么不同:

Object* & func() { Object* j = new Object(); return j; }

应该清楚这是无效的。您将返回j的引用,但返回后j不再存在。

虽然这不是惯用语,但你可以这样做:

Object& func() { return *(new Object()); }

这会分配一个新的Object,并返回对它的引用。 Object不是临时的,所以这是安全的。调用者仍然需要delete来避免泄漏。

您分配的对象及new返回的指针是两个不同(但相关)的东西。

执行此操作的惯用方法是按值返回对象。如果必须动态分配它,则应使用某种智能指针以避免手动管理生命周期。

答案 1 :(得分:1)

New将动态分配该类型的新变量。您可以将它用于任何类型。 肯定需要调用delete以释放内存。

您无法返回新作为参考。你正试图从指针转换为类,但这不起作用。

答案 2 :(得分:0)

  

是否会导致内存泄漏?

是。当您使用new指针时,需要使用delete显式释放该内存。
如果你不是很小心,你很可能会泄漏这段记忆。

下面的代码返回一个指向新分配内存的指针,即该内存的开头。

Object* func() { return new Object(); }

智能指针可以通过管理生命周期让您的生活更轻松,并为您释放内存。例如:

shared_ptr<Object> var = make_shared<Object>();

(如果你知道该对象不会被分享,你可以使用unique_ptr

或者与您更相关:

shared_ptr<Object> func()
{
    return make_shared<Object>();
}

int main()
{
    shared_ptr<Object> var = func();
}