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