一位有经验的 C++ 用户告诉我,我应该努力使用堆变量,即:
A* obj = new A("A");
相对于:
A obj("A");
除了所有关于使用指针的优点和灵 active 之外,他说最好把东西放在堆上而不是堆栈上(堆栈比堆小吗?)。这是真的吗?如果有,为什么?
注意:我知道生命周期的问题。假设我已经适本地管理了这些变量的生命周期。 (即,唯一关注的标准是堆与堆栈存储,没有生命周期问题)
最佳答案
根据上下文,我们可以考虑堆或堆栈。每个线程都有一个堆栈,线程通过调用函数来执行指令。当一个函数被调用时,函数变量被压入堆栈。并且当函数返回堆栈回滚并回收内存时。现在线程本地堆栈有一个大小限制,它会有所不同并且可以在一定程度上进行调整。考虑到这一点,如果每个对象都是在堆栈上创建的,并且该对象需要大量内存,那么堆栈空间将耗尽,从而导致 stackoverflow 错误。除此之外,如果对象要被多个线程访问,那么将这样的对象存储在堆栈上是没有意义的。
因此小变量、小对象的大小可以在编译时确定,指针应该存储在堆栈上。将对象存储在堆或自由存储上的问题是,内存管理变得困难。有内存泄漏的机会,这很糟糕。此外,如果应用程序尝试访问已删除的对象,则可能会发生访问冲突,从而导致应用程序崩溃。
C++11 引入了智能指针(共享、唯一),使堆内存管理更容易。实际引用的对象在堆上,但被始终在堆栈上的智能指针封装。因此,当在函数返回事件或异常期间堆栈回滚时,智能指针的析构函数会删除堆上的实际对象。在共享指针的情况下,引用计数保持不变,当引用计数为零时,实际对象被删除。 http://en.wikipedia.org/wiki/Smart_pointer
关于c++ - 使用堆或堆栈变量更好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10860290/