四星 C++ 内存泄漏

内存泄漏:由于疏忽或错误导致的程序未能释放已经不再使用的内存。
进一步解释:

  • 并非指内存从物理上消失,而是指程序在运行过程中,由于疏忽或错误而失去了对该内存的控制,从而造成了内存的浪费。

  • 常指堆内存泄漏,因为堆是动态分配的,而且是用户来控制的,如果使用不当,会产生内存泄漏。

  • 使用 malloc、calloc、realloc、new 等分配内存时,使用完后要调用相应的 free 或 delete 释放内存,否则这块内存就会造成内存泄漏。

  • 指针重新赋值

1
2
3
char *p = (char *)malloc(10);
char *p1 = (char *)malloc(10);
p = np;

开始时,指针 p 和 p1 分别指向一块内存空间,但指针 p 被重新赋值,导致 p 初始时指向的那块内存空间无法找到,从而发生了内存泄漏。

忘记了释放内存,造成内存泄露的后果

含有这种错误的函数每被调用一次就丢失一块内存。刚开始时系统的内存充足,你看不到错误。终有一次程序突然死掉,系统出现提示:内存耗尽。

再提一嘴内存溢出

概念:内存溢出out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请一个int,但是给其存了long才能存得下的数,那就是内存溢出

发生原因

  • 内存中加载的数据量过于庞大;

  • 代码中存在死循环

  • 递归调用太深,导致栈溢出

  • 内存泄漏最终导致内存溢出。

再来一嘴野指针

指向已经删除的对象或者申请访问受限内存区域的指针,称为野指针。

野指针与空指针不同,空指针是null。但是野指针并不知道指向了哪里,只能通过编程习惯规避。

可能发生的原因:

  • 指针没有初始化:指针变量在被创建未初始化时,并不是空指针,它的缺省值是随机的,会乱指一气。所以指针变量在创建同时就应对其进行初始化,要么将指针设置为NULL,要么让其指向一个合法的内存。

  • 指针释放之后未置空:有时指针在free或者delete之后未赋值NULL,有可能被误以为是合法的指针,不能进关注free和delete后的指针名,他们只是将指针所指向的内存空间释放掉而已,但并没有把指针自身消灭,此时,指针指向的就是“垃圾”内存。被释放掉内存空间的指针应该立即将其置为NULL,防止产生野指针。

  • 指针操作超越变量作用域

我觉得重点还是关注 没有初始化,以及本来指向了一块内存,然后指向的变量生命周期结束了,这个指针没有指向了,要及时置空。