C++ new和delete的使用

C++ new 和 delete

在C++中, 通过newdelete管理动态内存.

  • new : 在动态内存中为对象分配空间并返回一个指向该对象的指针
  • delete : 接受一个动态对象的指针, 销毁该对象, 并释放与之关联的内存

1. 使用new动态分配和初始化对象

在堆中分配的内存是无名的, 因此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的值为0

2. 内存耗尽

一旦一个程序用光了它所有可用的内存, new 表达式就会失败, 默认情况下, 如果 new不能分配所要求的内存空间, 会抛出一个bad_alloc的异常.

C++的代码运行于用户级, 内核运行于系统级, 当你向系统申请内存时, 系统就不给你了, 所以耗尽内存还是比较难的

3.释放动态内存

为了防止内存耗尽, 在动态内存使用完毕后, 必须将其归还给系统, 我们通过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赋予指针, 这样就清楚地指针不指向任何对象.

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

远离蒙昧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值