c++ - 使用堆或堆栈变量更好吗?

标签 c++ variables heap-memory stack-memory

一位有经验的 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/

相关文章:

C++ Builder 10.2.3 [ilink32 错误] 致命 : Unable to open file 'FORMS.OBJ'

c++ - 为什么我的数据流在 20 或 30 行后开始重复?

javascript - 我需要使用变量填充表格以创建 Javascript 散点图的帮助

c++ - 当 std::wstring 在堆栈上定义时,Hooked NtOpenFile 失败

arrays - 如何在 Rust 1.0 中的堆上分配数组?

将 XCode 升级到版本 11.1 后 C++ 编译失败

c++ - 在二维数组中按字母顺序对字符串数组进行排序 (C++)

javascript - 如果变量尚未传递给函数,则初始化该变量。这是正确的方法吗?

javascript - 将一系列数字设置为变量(Javascript)

android - 由于 eclipse 中的 java 堆空间,无法使用微型 android 应用程序执行 dex