首先,当返回一个未命名的对象时,例如:
Object* func() { return new Object(); }
是一个匿名变量,临时变量,两者都不是,或两者兼而有之?让它未命名会导致它是临时的 - 因为一旦func返回它就会超出范围吗?我可以通过将其分配给调用代码块中的指针或引用来扩展其范围,还是非法/危险?
我的第二个担心是因为如果我是这样的话,它是用new
创建的:
Object *var = func()
在其他地方,之后我需要delete
吗?如果我没有删除它,我认为这会导致内存泄漏。
如果我改为引用:
Object& func() { return new Object(); }
我将新对象分配给指针或引用,访问该对象是非法/危险吗?
另外,如果我在这里缺少任何其他术语,请说明一下。
答案 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();
}