【问题标题】:In C++, is created vector or map in a function on stack or heap?在 C++ 中,是在堆栈或堆上的函数中创建向量或映射吗?
【发布时间】:2021-06-15 21:18:08
【问题描述】:

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

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

vector<int> a

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

【问题讨论】:

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


    【解决方案1】:

    vector&lt;int&gt; 对象本身是在您选择的存储中创建的:如果您将其声明为局部变量,那将在自动存储中。

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

    std::map&lt;K,V&gt; 也是如此:当数据进入动态存储区时,对象会随您放置(自动、静态或动态内存,取决于您的声明)。

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

    【讨论】:

    • 我是一个函数,我只是声明vector a。而已。所以你的意思是它在堆栈中?那你能告诉我如何在堆中声明它吗?
    • @HaoShen 为什么要在堆上声明它?无需您费心。
    • @HaoShen 向量(通常是一对指向动态分配数据的开头和结尾的指针)在栈上;向量的大部分,即它的数据,都在堆中。
    • @HaoShen 向量的堆栈占用空间很小,不管向量中的数据量如何,它都保持不变。
    • @HaoShen 数据将保留在动态存储中,直到它被释放。 C++ 容器在其析构函数中释放其动态内存,因此堆中的数据将会丢失,除非您将该数据的所有权转移到另一个容器。
    【解决方案2】:

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

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

    【讨论】:

    • 如果声明为局部变量,向量本身就在堆栈上。然而,由向量管理的动态内存区域不在堆栈上。
    • 我想这就是发帖人要问的。不过,我会编辑我的答案。
    【解决方案3】:

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

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

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

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

    【讨论】:

    • 像这样的动态对象必须在堆上分配,才能自行增长或缩小。
    • @mebob,没有。正如对您的回答的评论中所述,vector 本身不是动态的。它包含一个动态分配的内存区域。
    • 我的错误,我假设问题是指数据而不是对象数据本身。
    【解决方案4】:

    这里,向量既存储在堆上,也存储在栈上。意思是,标头在堆栈上,但是当您将元素放入向量中时,这些元素是动态分配的,因此在堆上。

    【讨论】:

      猜你喜欢
      • 2011-04-28
      • 2020-03-30
      • 2016-05-20
      • 2014-04-21
      • 1970-01-01
      • 2019-09-22
      • 2012-01-23
      • 2016-03-06
      • 1970-01-01
      相关资源
      最近更新 更多