C++ new和delete的使用

C++ new和delete的使用,第1张

C++ new和delete的使用

文章目录
  • C++ new 和 delete
    • 1. 使用new动态分配和初始化对象
    • 2. 内存耗尽
    • 3.释放动态内存
      • 3.1 指针值和delete
      • 3.2 delete之后重置指针值

C++ new 和 delete

在C++中, 通过new和delete管理动态内存.

  • 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赋予指针, 这样就清楚地指针不指向任何对象.

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5658687.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存