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

Is the object being returned temporary or anonymous, and could it cause memory leaks?

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

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

那个是匿名变量还是临时变量,两者都不是,还是两者都是?未命名是否会导致它是临时的——因为它一旦 func returns 就超出范围?我可以通过将它分配给调用代码块中的指针或引用来扩展它的范围,还是 illegal/dangerous?

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

Object *var = func()

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

如果我返回一个参考:

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

并且我将新对象分配给一个指针或引用,访问该对象会是illegal/dangerous吗?

此外,如果我在这里遗漏了任何其他术语,请说明一下。

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

你不能return新的作为参考。您正在尝试从指针转换为 class,但这不起作用。

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

这分配了一个带有 new 的对象(必须用 delete 释放,否则会发生泄漏)并且 return 是一个指向它的值的指针。

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

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

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

我们还有一个问题 -- 这分配了一个对象 new 并且 return 是对指向它的临时指针的引用。这是非法的——您不能 return 对临时文件的引用。与以下内容没有区别:

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

应该清楚这是无效的。您正在 return 引用 j,但 j 在您 return.

之后不再存在

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

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

这会分配一个新的 Object,并且 return 是对它的引用。 Object 不是临时的,所以这是安全的。调用者仍然必须 delete 它以避免泄漏。

您分配的对象和由 new 编辑的指向它的指针是两个不同(但相关)的东西。

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

Could it cause memory leaks?

是的。当您将指针与 new 一起使用时,您需要使用 delete 显式释放该内存。
如果您不小心,您很可能会泄漏该内存。

下面的代码returns指向新分配内存的指针,即该内存的开头。

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