C ++何时在堆上进行分配?

时间:2013-09-20 22:14:47

标签: c++ memory-management stack heap

在询问另一个问题时(以及之前)我想知道如何判断是在堆上创建对象还是将其作为堆栈中的对象?我应该问自己有关正确分配的对象?

5 个答案:

答案 0 :(得分:8)

如果必要的话,把它放在堆上,如果可以的话,把它放在堆上。

你需要把哪些东西放在堆上?任何长度不一的东西。任何可能需要为null的对象。任何非常大的东西,以免造成堆栈溢出。

答案 1 :(得分:6)

简单回答。

当它超出范围时,你想让它闲逛并能够使用吗?

答案 2 :(得分:3)

取决于对象的预期生命周期。

  • 如果您希望对象在函数返回后仍然存活,则HEAP,否则为STACK

如果一个对象放在HEAP中,那么一旦它的用法结束,它必须由程序员明确地自由()编辑或删除;否则程序将泄漏内存。

答案 3 :(得分:1)

使用堆的两个原因:

1-您想要当前范围之后的数据。

2-您想要保留大容量内存。

除了留在堆栈上。

注意:不要在堆栈上保留大量内存,否则会出现“堆栈溢出”;)

答案 4 :(得分:0)

堆栈内存很快。它很快,因为(a)没有系统开销来分配内存 - 分配是通过简单地在一条指令中移动堆栈指针来完成的,并且(b)堆栈中的内存是" hot"所以它已经在缓存中了。堆内存很慢,因为(a)它需要大量的系统工作来环顾四周并找到一大堆内存,而且(b)可能不在缓存中,并且需要驱逐你可能想要的一些数据。

堆栈内存不会碎片化。堆最终可能会如此碎片化,您无法分配任何东西(尽管具有讽刺意味的是,仍有足够的未使用内存!)

对于长寿命数据和大数据(多KB或更多),您必须使用堆。

分配更大堆栈的危险在于,如果运行多个线程,可能会对您造成伤害。你必须为#34;最坏的情况"用法。每个线程都需要自己的堆栈。在高核心数的机器上(可能有200多个线程在运行),您可能不想随意增加堆栈。另一方面,堆不需要针对"最坏情况"用法 - 效率更高。