指针分配与正常声明

时间:2010-02-17 15:17:38

标签: c++ pointers allocation

有时我在各种C ++程序中看到,声明和使用的对象如下:

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

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

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

7 个答案:

答案 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项好处:

  1. 您现在可以明确地管理对象的生命周期(但不能忘记它)
  2. 您可以将对象存储到具有多态性的容器中
  3. 你不会阻塞堆栈,因此进入堆栈溢出的风险较小

答案 6 :(得分:0)

可以用相反的方式提出问题:你何时应该使用奇怪的第一个选项?基本上,如果你想分配大对象,因为如果你不必这样做,你可以把它放在堆栈上,它将是更快的选择:这是使用C ++而不是JAVA的主要优点之一,它放置了所有对象在堆上。当处理许多小对象的分配时,这种好处特别正确:将它们放在堆栈上以提高速度。取消引用指针会产生成本开销。您可以找到有关boost池库的here信息,它为我们提供了管理此类分配的工具。