【问题标题】:What is the difference between static and dynamic allocation of vector in c++?c++中vector的静态分配和动态分配有什么区别?
【发布时间】:2019-06-18 13:41:29
【问题描述】:

我知道以下情况的区别:

case 1: int a[10];

对于情况 1,数组的内存分配在堆栈上。

case 2: int *a = new int[10];

对于情况 2,在堆上分配内存并返回一个指针。

但是下面两个声明有什么区别, 至于向量内存总是在堆上分配的

vector<int> v1;
vector<int> *v2 = new vector<int>();

【问题讨论】:

  • 和其他类型没什么区别
  • @KABoissonneault,在数组中,区别是在一种情况下在堆栈上分配内存,在另一种情况下在堆上分配内存,但在向量内存中总是在堆上分配,那么有什么区别?
  • 无论 std::vector 包含多少元素或元素类型,在 ubuntu,g++ v7.3 上,“sizeof(std::vector)”报告 24 字节.因此:v1 占用 24 字节的自动内存,加上动态内存中的 n 字节来保存元素。 v2占用8字节的自动内存(一个指针),并使用24字节的动态内存来保存向量对象,并使用动态内存中的n字节来保存元素。
  • @Frank 不确定这实际上是重复的,因为两者之间的差异不仅仅是对象的内存来自哪里。对象的生命周期也存在差异,您引用的发布是针对 C 的,其中这是 C++,向量可以具有特定的内存分配器。

标签: c++ dynamic-memory-allocation stdvector static-memory-allocation


【解决方案1】:

以下两个语句创建一个vector&lt;&gt;,但两者之间存在一些差异。

vector<int> v1;
vector<int> *v2 = new vector<int>();

首先,实际的向量数据存储将从堆或指定内存分配器使用的任何源中分配(请参阅Where does a std::vector allocate its memory?),这对两者都是一样的。

这两个区别是 (1) vector&lt;&gt; 管理数据的存储位置和{2} vector&lt;&gt; 的生命周期及其分配的内存。

在第一种情况下,vector&lt;&gt; 管理数据存储在本地内存、堆栈中,当vector&lt;&gt; 变量超出范围时,将调用析构函数以消除堆上的向量数据存储空间和堆栈上的向量管理空间。在vector&lt;&gt; 变量超出范围的第一种情况下,vector&lt;&gt; 内存被正确释放。

在第二种情况下,vector&lt;&gt; 存储数据空间和vector&lt;&gt; 管理空间都在堆上。

所以当包含vector&lt;&gt; 地址的指针变量超出范围时,vector&lt;&gt; 本身的析构函数不会被调用。结果是内存无法恢复,因为析构函数会清理并释放为vector&lt;&gt; 的数据存储区域和管理存储区域分配的内存,而从未调用过。

第二种情况确保vector&lt;&gt;被正确清理的一种可能性是使用一个智能指针,当它超出范围时也会触发指向对象的析构函数。

在大多数情况下需要第二种情况,使用new 创建vector&lt;&gt; 很少见,第一种情况不仅最常见而且更安全。

【讨论】:

    【解决方案2】:

    只有std::vector 存储内存分配在堆上,其余的(即一些指向存储的指针+一些额外的数据成员)通常可以位于堆栈上,但是通过写入new vector&lt;int&gt;() 你强制整个事情在堆上。
    通常不需要这样分配向量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-17
      • 2012-01-13
      • 1970-01-01
      • 2020-10-28
      • 1970-01-01
      • 2023-03-07
      • 2018-01-26
      • 2020-12-05
      相关资源
      最近更新 更多