new 与delete
分配内存与释放内存
new分配的内存块通常与常规变量声明分配的内存块不同。变量的值都存储在被称为栈的内存区域。而new从被称为堆或自由存储区的内存区域分配内存。
例如:
int *ps=new int;
delete ps;
只能用delete来释放使用new分配的内存,然而,对空指针使用delete是安全的
动态数组
int *psome=new int[20];
delete [] psome;
不要使用delete来释放不是new的内存
不要使用delete释放同一个内存块两次
自动存储,静态存储和动态存储
自动存储
在函数内部定义的常规变量使用自动存储空间,被称为自动变量。这种变量在所属的函数被调用时自动产生,在该函数结束时消亡。
实际上,自动变量是一个局部变量,其作用域为包含它的代码块。代码块是被包含在花括号的一段代码,到目前为止,我们使用的所有代码块都是整个函数。
自动变量通常存储在栈中。这意味着执行代码时,其中的变量将以此加入到栈中,而在离开代码块时,将按相反的顺序释放这些变量,这被称为后进先出,因此,在程序执行过程中,栈将不断地增大和缩小。
静态存储
静态存储是整个程序执行期间都存在的存储方式。使变量称为静态的方式有两种,一种是在函数外面定义它。另一种是在声明变量时使用关键字static;
动态存储
new和delete运算符提供了一种比自动变量和静态变量更灵活的方法。他们管理了一个内存池,这在c++中被称为自由存储空间或堆。该内存池同用于静态变量和自动变量的内存是分开的。它数据的声明周期完全不受程序或函数的生存时间控制。
可替代数组的类–>模板类
vector
模板类vector类似于string类,也是一种动态数组。可在运行阶段设置vector对象的长度
要是用vector,要包含头文件 vector,并且在名字空间std中
声明: vector <typenName> vt(n_elem);
#include <vector>
using namespace std;
vector<int> v1; //创建一个大小为0的整型数组
int n;
cin>>n;
vector<double> vd(n); //创建一个大小为n的double对象
与数组相比,效率稍低
array
与数组一样,array对象的长度也是固定的。也使用栈,而不是自由存储区。效率与数组相同,但更方便,安全。
声明: array<typeName,n_elem> arr;
#include <array>
using namespace std;
array<int,5> ai;
array<double,4> ad={1.2.2.1,4.5,6.3};
无论是数组,vector,array都可使用标准数组表示法来访问各个元素。
数组和array存储在相同的内存区域,即栈中;而vector对象存储在自由存储区或堆中;
可以将一个array对象赋给另一个array对象,对于数组,必须逐元素复制数据。
ai[-2] =20; //越界了,但是不会被检查出来
可使用成员函数at():
ai.at(1)=2;
中括号表示法和成员函数at()的差别在于,使用at()时,将在运行期间捕获非法索引,而程序默认将中断。
这种额外检查的代价是运行时间长