有时我会在各种 C++ 程序中看到这样声明和使用的对象:
object *obj = new object;
obj->action();
obj->moreAction();
//etc...
这样做有什么好处,而不是简单地做:
object obj;
obj.action();
obj.moreAction();
//etc
有时我会在各种 C++ 程序中看到这样声明和使用的对象:
object *obj = new object;
obj->action();
obj->moreAction();
//etc...
这样做有什么好处,而不是简单地做:
object obj;
obj.action();
obj.moreAction();
//etc
是的 - 您可以将指针存储在容器中或从函数中返回它,并且当指针超出范围时对象不会被破坏。使用了指针
这不是免费的——delete
当你不再需要对象时,你需要手动销毁它(
第一种形式,在堆上分配对象,使您可以完全控制(并完全负责)对象的生存时间:您必须obj
显式删除。
在第二种形式中,当obj
超出分数时(离开当前代码块时),对象会自动且不可撤销地销毁。
没有人提到的另一个原因。
堆栈通常为 1Mb,因此必须在堆上创建大对象(使用 new)
基本上,如果您希望一个对象超出您创建它的范围的生命周期,您应该只使用“new”。例如:
X* g(int i) { /* ... */ return new X(i); } // the X outlives the call of g()
如果您希望一个对象仅存在于一个范围内,请不要使用“new”,而只需定义一个变量:
{
ClassName x;
// use x
}
归结为对相关对象的生命周期有更多的控制(使用时new
)。
是的,有一个很好的理由:使用后一种形式时,您有更多机会拥有正确的程序..
问题是前一种形式(指针)是一种C
主义,C++
你应该使用智能指针来确保在对象生命结束时正确销毁对象。
现在,如果你使用std::auto_ptr<Object> obj(new Object());
你有3个好处:
可以用相反的方式问:什么时候应该使用奇怪的第一个选项?基本上,如果您想分配大对象,因为如果您不必这样做并且可以将其放在堆栈上,那将是更快的选择:这是使用 C++ 而不是 JAVA 的主要优点之一,后者将所有对象在堆上。当处理很多很多小对象的分配时,这种好处尤其明显:将它们放在堆栈上以提高速度。取消引用指针存在成本开销。你可以在这里找到关于 boost pool library 的信息,它为我们提供了管理此类分配的工具。