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<>
是很少见的,第一种情况不仅最常见而且更安全。
我知道以下情况的区别:
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<>
是很少见的,第一种情况不仅最常见而且更安全。