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需加[];

猜你喜欢

转载自blog.csdn.net/oTianLe1234/article/details/114692815