【发布时间】:2021-06-15 21:18:08
【问题描述】:
我只是有一个非常简单的问题,但我无法通过谷歌找到它。
在 C++ 中,如果我们在函数中创建一个整数,我相信它会在堆栈中。但是如果我们创建一个矢量或地图,例如,
vector<int> a
它会在堆栈还是堆上?我相信这是一种类对象(类似于java中“new”创建的对象)所以它可能应该在堆上?
【问题讨论】:
标签: c++ heap-memory stack-memory
我只是有一个非常简单的问题,但我无法通过谷歌找到它。
在 C++ 中,如果我们在函数中创建一个整数,我相信它会在堆栈中。但是如果我们创建一个矢量或地图,例如,
vector<int> a
它会在堆栈还是堆上?我相信这是一种类对象(类似于java中“new”创建的对象)所以它可能应该在堆上?
【问题讨论】:
标签: c++ heap-memory stack-memory
vector<int> 对象本身是在您选择的存储中创建的:如果您将其声明为局部变量,那将在自动存储中。
但是,向量通常表示为一对指针;该向量的 数据 分配在动态存储区中。
std::map<K,V> 也是如此:当数据进入动态存储区时,对象会随您放置(自动、静态或动态内存,取决于您的声明)。
从 C++11 开始,您可以将 std::array<T> 类用于固定大小的集合。此集合的数据将完全存储在您放置集合本身的存储中。但是,此类集合不可调整大小。
【讨论】:
任何动态大小的对象的数据都将被堆分配。如果它在堆栈上,如果它变得太大,就会有溢出和程序崩溃的风险。
对象本身(即动态数组的大小和指向内存中数据位置的指针)可能会存储在堆栈中。
【讨论】:
是的,这也将在堆栈上创建。
只有在调用 new 或 malloc 时才会在堆上创建变量。
类型并不重要,重要的是它是如何创建的。
如果您尝试决定是在堆栈上还是动态(在堆上)创建变量,您应该考虑对象的生命周期。如果您只是在创建它的范围内需要它,那么在堆栈上创建它。否则动态创建。
【讨论】:
vector 本身不是动态的。它包含一个动态分配的内存区域。
这里,向量既存储在堆上,也存储在栈上。意思是,标头在堆栈上,但是当您将元素放入向量中时,这些元素是动态分配的,因此在堆上。
【讨论】: