C/C++内存泄漏和野指针的区别

内存泄漏

概念解释

使用动态存储分配函数或关键字申请的内存空间,在使用完毕后未释放,结果导致一直占据该内存单元,不能被任何程序再次使用,直到程序结束。即所谓内存泄漏。

表现行为

程序运行时间越长,占用内存越多,最终用尽全部可用内存,整个系统崩溃。由程序申请的一块内存,已经使用完毕,未进行释放那么这块内存就泄露了。一是指针已置空,那么没有任何指针指向它;二是指针未置空,但也不再有效使用。

导致原因:

  • new申请动态内存,使用完毕后未delete释放内存;
  • malloc申请动态内存,使用完毕后未free释放内存;

野指针

概念解释

野指针,也就是指向不可用内存区域的指针。通常对这种指针进行操作的话,将会使程序发生不可预知的错误。
"野指针"不是NULL指针,是指向"垃圾"内存的指针。人们一般不会错用NULL指针,因为用if语句很容易判断。但是“野指针”是很危险的,if语句对它不起作用。

表现行为

程序崩溃或发生不可预知的错误。

导致原因

  • 指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,指向内存区域未知。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。
  • 指针p被free或者delete之后,没有置为NULL。让人误以为p是个合法的指针,但它只是把指针所指的内存给释放掉,并没有把指针本身初始化。通常会用语句if (p != NULL)进行防错处理,这种情况下if语句起不到防错作用,因为即便p不是NULL指针,它也不指向合法的内存块。

new/delete,malloc/free的区别与联系

  • malloc/free是c标准库的库函数,new/delete是C++的关键字;
  • new/delete底层也是调用的malloc/free,malloc/free调用系统api;
  • malloc开辟空间类型大小需手动计算,new是由编译器根据具体类型自己计算;
  • malloc返回类型为void*,必须强制类型转换对应类型指针,new则直接返回对应类型指针;
  • 无论释放几个空间大小,free只传递指针,多个对象时delete需加[];
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

星火撩猿

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

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

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

打赏作者

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

抵扣说明:

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

余额充值