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

时间:2013-11-24 20:05:13

标签: c++ stack heap

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

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

vector<int> a

它会在堆栈还是堆上?我相信这是一种类对象(类似于java中“new”创建的对象)所以可能它应该在堆上?

4 个答案:

答案 0 :(得分:3)

vector<int>对象本身是在您选择的存储中创建的:如果您将其声明为本地变量,那么它将位于自动存储中。

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

同样适用于std::map<K,V>:当数据进入动态存储区域时,对象会移动到任何位置(自动,静态或动态内存,基于您的声明)。

从C ++ 11开始,您可以将std::array<T>类用于固定大小的集合。此集合的数据将完全存储在您放置集合本身的存储中。但是,此类集合无法调整大小。

答案 1 :(得分:2)

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

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

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

如果您正在尝试决定是在堆栈上还是动态(在堆上)创建变量,则应考虑对象的生命周期。如果您只是在其创建的范围内需要它,那么在堆栈上创建它。否则动态创建它。

答案 2 :(得分:2)

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

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

答案 3 :(得分:0)

这里,向量既存储在堆上又存储在堆栈中。意思是,标题位于堆栈中,但是当您将元素放入向量时,它们会被动态分配,因此在堆上。