4

有时我会在各种 C++ 程序中看到这样声明和使用的对象:

object *obj = new object;
obj->action();
obj->moreAction();
//etc...

这样做有什么好处,而不是简单地做:

object obj;
obj.action();
obj.moreAction();
//etc
4

7 回答 7

5

是的 - 您可以将指针存储在容器中或从函数中返回它,并且当指针超出范围时对象不会被破坏。使用了指针

  • 避免不必要的对象复制,
  • 便于创建可选对象,
  • 用于自定义对象生命周期管理,
  • 用于创建复杂的类图结构,
  • 对于上述的组合。

这不是免费的——delete当你不再需要对象时,你需要手动销毁它(

于 2010-02-17T15:20:30.630 回答
3

第一种形式,在堆上分配对象,使您可以完全控制(并完全负责)对象的生存时间:您必须obj显式删除。

在第二种形式中,当obj超出分数时(离开当前代码块时),对象会自动且不可撤销地销毁。

于 2010-02-17T15:22:46.593 回答
2

没有人提到的另一个原因。
堆栈通常为 1Mb,因此必须在堆上创建大对象(使用 new)

于 2010-02-17T15:26:39.727 回答
1

基本上,如果您希望一个对象超出您创建它的范围的生命周期,您应该只使用“new”。例如:

X* g(int i) { /* ... */ return new X(i); } // the X outlives the call of g()

如果您希望一个对象仅存在于一个范围内,请不要使用“new”,而只需定义一个变量:

{
    ClassName x;
    // use x
}
于 2010-02-17T15:21:23.057 回答
0

归结为对相关对象的生命周期有更多的控制(使用时new)。

于 2010-02-17T15:22:46.483 回答
0

是的,有一个很好的理由:使用后一种形式时,您有更多机会拥有正确的程序..

问题是前一种形式(指针)是一种C主义,C++你应该使用智能指针来确保在对象生命结束时正确销毁对象。

现在,如果你使用std::auto_ptr<Object> obj(new Object());你有3个好处:

  1. 您现在明确地管理对象的生命周期(但不能忘记它)
  2. 您可以将对象存储到具有多态性的容器中
  3. 您不会阻塞堆栈,因此遇到堆栈溢出的风险较小
于 2010-02-17T15:52:25.683 回答
0

可以用相反的方式问:什么时候应该使用奇怪的第一个选项?基本上,如果您想分配大对象,因为如果您不必这样做并且可以将其放在堆栈上,那将是更快的选择:这是使用 C++ 而不是 JAVA 的主要优点之一,后者将所有对象在堆上。当处理很多很多小对象的分配时,这种好处尤其明显:将它们放在堆栈上以提高速度。取消引用指针存在成本开销。你可以在这里找到关于 boost pool library 的信息,它为我们提供了管理此类分配的工具。

于 2013-03-15T00:46:52.523 回答