
C/C++ new和delete使用注意事项
发布日期:2021-05-07 22:09:30
浏览次数:11
分类:原创文章
本文共 1028 字,大约阅读时间需要 3 分钟。
一、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运算符来确定动态分配数组的字节数
发表评论
最新留言
很好
[***.229.124.182]2025年03月30日 07时23分29秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
网页设计所需要的工具,各个岗位的职能,都在这里了
2019-03-05
android GPS JAVA 获取GPS功能是否禁用
2019-03-05
vue项目通过vue.config.js配置文件进行proxy反向代理跨域
2019-03-05
Linux下安装MySql过程
2019-03-05
原生vue实现VantUI中IndexBar索引导航栏功能
2019-03-05
解决:android TextView上响应部分文字的事件
2019-03-05
android:使用audiotrack 类播放wav文件
2019-03-05
vue通过better-scroll 封装自定义的下拉刷新组件
2019-03-05
android解决:使用多线程和Handler同步更新UI
2019-03-05
vue自定义封装Loading组件
2019-03-05
解决移动端项目中苹果ios和安卓android手机点击输入框网页页面自动放大缩小
2019-03-05
Element UI 中动态路由的分析及实现
2019-03-05
使用springMVC配置视图管理器后找不到指定的页面
2019-03-05
关于js中对于Promise的深入理解
2019-03-05
对于js中的this指向的深入理解
2019-03-05
杭电 2007 平方和与立方和(输入数据的大小顺序并不能默认)
2019-03-05
十大排序算法之三:插入排序(Python)
2019-03-05
利用Python实现循环队列
2019-03-05
十大排序算法之四:希尔排序(Python)
2019-03-05
利用递归实现二叉树的前中后序遍历(Python)
2019-03-05