c ++中向量的静态和动态分配有什么区别?

What is the difference between static and dynamic allocation of vector in c++?

我知道以下情况的区别:

case 1: int a[10];

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

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

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

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

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

只有 std::vector 存储内存分配在堆上,其余部分(即一些指向存储的指针 + 一些额外的数据成员)通常可以位于堆栈上,但是通过写入 new vector<int>() 你把整个东西都强行放到堆上。
通常不需要这样分配向量。

以下两个语句创建了一个 vector<> 但是两者之间存在一些差异。

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

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

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

第一种情况vector<>管理数据存储在本地内存,堆栈,当vector<>变量超出范围时,调用析构函数消除向量数据存储space 在堆上,矢量管理 space 在堆栈上。在第一种情况下,当 vector<> 变量超出范围时,vector<> 内存被正确释放。

在第二种情况下,vector<>存储数据space和vector<>管理space都在堆上。

因此,当包含 vector<> 地址的指针变量超出范围时,不会调用 vector<> 本身的析构函数。结果是内存未恢复,因为从未调用过为 vector<> 的数据存储区域和管理存储区域清理和释放分配内存的析构函数。

第二种情况确保 vector<> 被正确清理的一种可能性是使用智能指针,当它超出范围时也会触发所指向事物的析构函数。

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