Aja*_*pa1 3 c++ stdvector dynamic-memory-allocation static-memory-allocation
我知道以下情况的区别:
case 1: int a[10];
Run Code Online (Sandbox Code Playgroud)
对于情况 1,数组的内存在堆栈上分配。
case 2: int *a = new int[10];
Run Code Online (Sandbox Code Playgroud)
对于情况 2,在堆上分配内存并返回一个指针。
但是下面两个声明有什么区别,因为向量内存总是分配在堆上
vector<int> v1;
vector<int> *v2 = new vector<int>();
Run Code Online (Sandbox Code Playgroud)
以下两个语句创建了一个vector<>,但是两者之间存在一些差异。
vector<int> v1;
vector<int> *v2 = new vector<int>();
Run Code Online (Sandbox Code Playgroud)
首先,实际的向量数据存储将从堆或指定内存分配器使用的任何来源分配(请参阅std::vector 在哪里分配其内存?),这对于两者来说都是相同的。
两个区别是 (1) 管理数据的存储位置以及 {2} 管理数据及其分配的内存vector<>的生命周期。vector<>
第一种情况vector<>管理数据存储在本地内存、栈上,当vector<>变量超出作用域时,会调用析构函数消除堆上的向量数据存储空间和栈上的向量管理空间。在第一种情况下,当vector<>变量超出范围时,vector<>内存会被正确释放。
在第二种情况下,vector<>存储数据空间和vector<>管理空间都在堆上。
因此,当包含 the 地址的指针变量vector<>超出范围时,vector<>不会调用其自身的析构函数。结果是内存无法恢复,因为vector<>从未调用为数据存储区域和管理存储区域分配的内存的析构函数。
第二种情况确保vector<>正确清理的一种可能性是使用智能指针,当它超出范围时也会触发所指向事物的析构函数。
在大多数情况下,很少需要使用第二种情况new来创建vector<>,而第一种情况不仅是最常见的,而且也更安全。