C++中定义了new和delete俩个运算符来直接管理内存
1.动态分配单一对象
(1)使用new动态分配和初始化对象
由于动态分配的内存是无名的,所以new不能为其分配对象名,而是返回指向该对象的指针
//分配一个int型的对象
int *pi = new int;
默认情况下,动态分配的对象是默认初始化的,我们也可以对其直接初始化。使用()构造方式或列表初始化
//构造方式初始化
int *pi = new int(66);
//列表形式初始化
vector<int> *pv = new vector<int>{1,2,4};
处于安全考虑,对动态分配的对象进行初始化是个好主意
2.动态分配const对象
用new分配const对象是合法的
//实例
const int *pci = new const int();
3.内存耗尽
即使我们的计算机的内存已经很大了,但是我们每个程序的自由空间还是有可能会被用完,此时调用new就会失败,new调用失败就会抛出bad_alloc异常,我们可以通过nothrow来阻止它抛出异常
nothrow定义在头文件new中
int *pi = new(nothrow)int;
2.动态释放单一对象
我们使用delete来释放对象,我们传递给delete的指针必须指向动态分配的内存,或是一个空指针,释放一块并非new分配的内存其结果是未定义的
int *pi = new int();
delete pi;
需要注意的是动态对象的生存期直到其被释放为止,这就意味着如果我们忘记delete那么这块内存将一直存在,所以我们几乎可以生成一条准则,当我们调用new时,那么一定要在结尾调用delete!!!
3.动态数组的分配与释放
前面介绍了new与delete一次只分配火释放一个对象,有时候我们需要像数组一样一次为很多对象分配一块内存。new同样有此功能具体用法如下
//分配5个int大小的内存
int *pi = new int[5];
分配好动态数组我们可以用delete来释放
delete []pi
注意pi前面不许有个[]来显示的告知系统所要释放的是个数组
需要注意的是动态分配的数组并不是数组对象,所以数组对象的好多功能它不能用,例如begin和end函数