C/C++ new和delete使用注意事项

一、new的作用

在C/C++语言编程时,常常会使用到指针。指针是在编程中是最基本也是最常用的操作。但是指针所带来的问题却是C/C++编程中,最常见的,也是最令人头疼的。使用指针有一个很重要的原则创建指针之后,在使用解引用(*)操作之前,一定要初始化指针指向的数据地址
给指针初始化指向的数据地址,常见的有两种方式。一种是,直接将指针指向当前已存在的变量的地址,另一种就是使用new或者C语言中的malloc函数动态的分配地址。如下代码所示:

int a = 10;
int *p1; 
// 法一,指向变量地址
p1 = &a;
// 法二,动态的分配地址,但是注意在不使用时用delete释放,后面会讲
int *p2;
p2 = new int;
*p2 = 20;

上述的两种初始化方式是有很大区别的,主要区别如下所示:

初始化指向变量地址的方法是在程序栈中分配内存;
new动态分配,是在未使用的堆内存中分配的;
new动态分配,需要用delete释放内存;

如果没有住够的内存进行new动态分配,那么new将会返回一个异常处理

二、delete释放内存

delete的操作一般是和new动态内存分配成对出现的。delete的作用是将内存释放并归还给内存池,从而高效的使用内存。值得注意的是虽然delete会释放掉指针指向的内存,但是并不会删除指针,因此在删除delete指针后,如果代码后面有需要也可一再次给指针分配地址。
在使用delete释放内存时因注意一下几个方面:

  • new的内存只能使用delete来释放
  • 不要用delete释放已经释放过的内存:
int *a = new int;
*a = 10;
delete a;
delete a; // 不能重复释放内存,会产生不确定的错误 
  • 不能用delete释放变量的地址,如下所示:
int b = 66;
int *c = &b;
delete c; // 这样是不允许的
  • delete可以释放空指针,所有值为0的指针均为空指针;
  • 一定要注意delete是针对的new分配的地址,而不是使用new的指针,如下面所示:
int *p = new int;
*p = 22;
delete p;
int a = 88;
p = &a;
delete p; // 注意这样是不允许的,相当于试图释放变量地址。
  • 如果使用new []为数组分配内存,则要用delete释放内存
  • 不能用sizeof运算符来确定动态分配数组的字节数

三、new/delete和malloc/free之间的区别

相同点:都是用了分配和释放动态内存的
本质上:new/delete是C++中的运算符,而malloc/free只是其C/C++中的某一个库函数
类型安全性:new/delete是安全的,而malloc/free不是安全的:

int* a = new float; //这样在编译时就会报错
int* a = malloc(sizeof(float)); //编译器不会报错,因此在程序执行时错误未知

用法:malloc必须要进行强制类型转换和需要sizeof求出需要的字节数,且对于用户自己定义的对象也不方便用malloc和free来管理,因为不能够执行构造函数和析构函数

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值