- C++ new 和 delete
- 1. 使用new动态分配和初始化对象
- 2. 内存耗尽
- 3.释放动态内存
- 3.1 指针值和delete
- 3.2 delete之后重置指针值
在C++中, 通过new和delete管理动态内存.
- new : 在动态内存中为对象分配空间并返回一个指向该对象的指针
- delete : 接受一个动态对象的指针, 销毁该对象, 并释放与之关联的内存
在堆中分配的内存是无名的, 因此new无法为其分配的对象命名, 而是返回一个指向该对象的指针.
int *pi = new int; //pi指向一个动态分配的, 未初始化的无名对象
默认情况下, 动态分配的对象是默认初始化的, 这意味着内置类型或者组合类型的对象的值将是未定义的. 而类类型对象将用默认的构造函数进行初始化.
string *ps = new string; int *pi = new int;
可以使用直接初始化方式来初始化一个动态分配的对象.
int *pi = new int(1024); strint *ps = new string(10,'9');
也可以对其进行值初始化
string *ps = new string; //默认初始化为空string string *ps1 = new string();//值初始化为空string int *pi = new int;//默认初始化; *pi的值未定义 int *pi1 = new int();//值初始化,*pi1的值为02. 内存耗尽
一旦一个程序用光了它所有可用的内存, new 表达式就会失败, 默认情况下, 如果 new不能分配所要求的内存空间, 会抛出一个bad_alloc的异常.
3.释放动态内存C++的代码运行于用户级, 内核运行于系统级, 当你向系统申请内存时, 系统就不给你了, 所以耗尽内存还是比较难的
为了防止内存耗尽, 在动态内存使用完毕后, 必须将其归还给系统, 我们通过delete来将动态内存归还给系统.delete表达式接受一个指针, 指向我们想要释放的对象
delete p;//p必须指向一个动态分配的对象或是一个空指针
delete表达式执行两个动作: 销毁给定的指针, 释放对应的内存
3.1 指针值和delete释放一块并非new分配的内存, 或者将相同的指针值释放多次是未定义的.
int i, *pi1 = &i, *pi2 = nullptr; double *pd = new double(33), *pd2 = pd; delete i; //错误,i不是指针 delete pi1;//未定义,pi1指向一个局部变量 delete pd;//正确 delete pd2;//未定义:pd2指向的内存已经被释放了 delete pi2;//正确,释放一个空指针总是没错误的3.2 delete之后重置指针值
当我们delete一个指针后, 指针值就变为无效了. 虽然指针已经无效, 但在很多机器上指针仍然保存着(已经释放了的)动态内存的地址. 在delete之后, 指针就变成了人们说的空悬指针,即指向一块曾经保存数据对象但现在已经无效的内存的指针.
解决方法: 在指针即将要离开其作用域之前释放掉它所关联的内存.
我们需要保留指针, 可以在delete之后将nullptr赋予指针, 这样就清楚地指针不指向任何对象.
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)