应该何时动态或自动实例化对象?

时间:2011-01-14 12:24:57

标签: c++ pointers object

例如,我应该使用:

Foo* object = new Foo ; 

或者我应该使用

Foo object ;

如果我弄乱了其中任何一个代码,请更正。现在还早,我是初学者。

7 个答案:

答案 0 :(得分:4)

应尽可能避免

operator new。它在所有领域都是浪费的 - 语法,语义和运行时的空间和时间。如果您有一个可以在堆栈中分配的对象,或者在类中静态分配,请执行此操作。动态分配只应在您需要时才使用 - 动态。如果您不需要它是动态的,请不要使用动态分配。

答案 1 :(得分:4)

在第一种情况下,您在堆中分配Foo对象,而在第二种情况下,它在堆栈中分配。

通常情况下在堆中分配:

  • Foo太大了,不适合堆叠。

  • 您不知道何时分配您的对象(在某些情况下您只需要分配它)。

  • 在弹出堆栈后,您还需要延长对象的生命周期。

在大多数其他情况下(我可能会忘记动态分配对象时有用的其他常见场景),可能建议在堆栈中分配对象,因为它在运行时会花费更少,并且更不容易出错并且更容易待处理。

答案 2 :(得分:1)

C ++中的默认值应该是使用对象本身而不是指针(智能或其他),除非有特殊原因要做。否则。

要获取默认构造的对象,必须关闭括号:

Foo object;

否则,编译器将把它作为函数的声明。

答案 3 :(得分:1)

自动实例化应该是常态,因为对象的生命周期由范围决定,并且销毁是自动的。当要求对象存在于当前范围之外时,动态实例化是必需的

如果对象过大,并且堆栈空间有限,则可能还需要动态实例化。然而,对于单个物体,这将是一个不寻常的情况,并且通常表明存在设计缺陷。

动态实例化通常用于对象的数组,此时生成的数组对于堆栈来说太大或者数组的大小未知 a priori

要记住的重要一点是,如果您动态实例化对象,则负责明确销毁它。不这样做会导致内存泄漏。

答案 4 :(得分:0)

使用new运算符分配对象需要在使用delete运算符之后进行清理。所以在大多数情况下,如果没有必要,我会选择静态实例化。

但是,因为静态实例化会将对象放在堆栈上,所以可能会遇到内存问题:堆栈只能容纳这么多数据。因此,有时可能需要动态实例化对象。

答案 5 :(得分:0)

第二种用法应该是:

Foo object;

两者之间的区别在于第一个是在堆上分配对象,第二个是在堆栈上分配对象。有许多不同之处,但这里有一些:

  1. 当你在堆上分配一个对象时,它会一直处于活动状态,直到你明确删除它为止,而在堆栈上分配的对象只有在函数结束之前才有效。

  2. 在堆上分配对象比在堆栈上分配对象更昂贵(在性能方面)。

  3. 您通常可以在堆上分配比堆栈更多的对象。

  4. 在堆上分配的对象可以在线程之间传递,而在堆栈上分配的对象不能(这不是100%正确,你可以让你的函数保持活着,而另一个线程正在处理你的对象,但是这几乎没用,而且效率低下。

  5. 一旦您进入声明它们的范围,就会分配在堆栈上分配的对象。有些情况下,您不一定希望始终分配它们,这时您可能更喜欢在堆上使用动态分配。

答案 6 :(得分:0)

在C ++中,只有在您真正需要在堆上(在运行时)分配内存时才应使用指针。在C中引入指针的目的之一是能够通过地址传递,以便可以将要修改的对象作为参数传递。在C ++中,您可以通过将References传递给对象来实现这一目的。