返回的对象是临时的还是匿名的,是否会导致内存泄漏?
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();
}
首先,当返回一个未命名的对象时,例如:
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();
}