C++ 在C++;,是否在堆栈或堆上的函数中创建向量或映射?

C++ 在C++;,是否在堆栈或堆上的函数中创建向量或映射?,c++,stack,heap,C++,Stack,Heap,我只是有一个非常简单的问题,但我无法通过谷歌找到它 在C++中,如果我们在函数中创建一个整数,我相信它将是堆栈。但如果我们创建一个向量或地图,例如 vector<int> a 向量a 它会堆起来还是堆起来?我相信这是类对象(类似于java中“new”创建的对象),所以它可能应该在堆上?是的,这也将在堆栈上创建 只有在调用new或malloc时才在堆上创建变量 类型并不重要,重要的是它是如何创建的 如果您试图决定是否在堆栈上创建变量,或者动态地(堆上),则应该考虑对象的生存期。如果

我只是有一个非常简单的问题,但我无法通过谷歌找到它

在C++中,如果我们在函数中创建一个整数,我相信它将是堆栈。但如果我们创建一个向量或地图,例如

vector<int> a
向量a
它会堆起来还是堆起来?我相信这是类对象(类似于java中“new”创建的对象),所以它可能应该在堆上?

是的,这也将在堆栈上创建

只有在调用new或malloc时才在堆上创建变量

类型并不重要,重要的是它是如何创建的


如果您试图决定是否在堆栈上创建变量,或者动态地(堆上),则应该考虑对象的生存期。如果您只是在创建它的范围内需要它,那么就在堆栈上创建它。否则动态创建它。

任何动态大小的对象的数据都将被堆分配。如果它在堆栈上,那么如果它变得太大,就会有溢出和程序崩溃的风险

对象本身(即动态数组的大小和指向数据在内存中的位置的指针)很可能存储在堆栈上。

在您选择的存储器中创建
向量
对象本身:如果您将其声明为局部变量,则将在自动存储器中

然而,向量通常表示为一对指针;该向量的数据在动态存储区域中分配

std::map
:对象放在任何地方(根据您的声明,自动、静态或动态内存),同时数据进入动态存储区域


从C++11开始,您可以将类用于固定大小的集合。此集合的数据将完全放在您放置集合本身的存储器中。但是,这样的集合不可调整大小。

这里,向量存储在堆和堆栈上。也就是说,头在堆栈上,但当您将元素放入向量时,这些元素会动态分配,因此在堆上。

如果将向量本身声明为局部变量,则向量本身在堆栈上。然而,由向量管理的动态内存区域不在堆栈上。我想这就是海报所问的。不过,我会编辑我的答案。像这样的动态对象必须被堆分配,它才能自己增长或收缩。@mebob,不是。正如对答案的评论中所述,
vector
本身不是动态的。它包含一个动态分配的内存区域。我的错误是,我假设问题是指数据,而不是对象数据本身。我是一个函数,我只是声明向量a。就这样。你是说它在堆栈中?那你能告诉我怎么在堆里申报吗?@HaoShen你为什么要在堆里申报?无需麻烦。@HaoShen向量(通常是指向动态分配数据的开始和结束的一对指针)位于堆栈上;向量的大部分(即其数据)在堆中。@HaoShen向量的堆栈占用空间很小,无论向量中的数据量有多大,它都保持不变。@HaoShen数据将保留在动态存储器中,直到它被释放。C++容器在析构函数中释放它们的动态内存,因此堆中的数据将丢失,除非将该数据的所有权转移到另一个容器。