四星 C++ 内存泄漏
内存泄漏:由于疏忽或错误导致的程序未能释放已经不再使用的内存。
进一步解释:
并非指内存从物理上消失,而是指程序在运行过程中,由于疏忽或错误而失去了对该内存的控制,从而造成了内存的浪费。
常指堆内存泄漏,因为堆是动态分配的,而且是用户来控制的,如果使用不当,会产生内存泄漏。
使用 malloc、calloc、realloc、new 等分配内存时,使用完后要调用相应的 free 或 delete 释放内存,否则这块内存就会造成内存泄漏。
指针重新赋值
1 | char *p = (char *)malloc(10); |
开始时,指针 p 和 p1 分别指向一块内存空间,但指针 p 被重新赋值,导致 p 初始时指向的那块内存空间无法找到,从而发生了内存泄漏。
忘记了释放内存,造成内存泄露的后果
含有这种错误的函数每被调用一次就丢失一块内存。刚开始时系统的内存充足,你看不到错误。终有一次程序突然死掉,系统出现提示:内存耗尽。
再提一嘴内存溢出
概念:内存溢出out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请一个int,但是给其存了long才能存得下的数,那就是内存溢出
发生原因
内存中加载的数据量过于庞大;
代码中存在死循环;
递归调用太深,导致栈溢出;
内存泄漏最终导致内存溢出。
再来一嘴野指针
指向已经删除的对象或者申请访问受限内存区域的指针,称为野指针。
野指针与空指针不同,空指针是null。但是野指针并不知道指向了哪里,只能通过编程习惯规避。
可能发生的原因:
指针没有初始化:指针变量在被创建未初始化时,并不是空指针,它的缺省值是随机的,会乱指一气。所以指针变量在创建同时就应对其进行初始化,要么将指针设置为NULL,要么让其指向一个合法的内存。
指针释放之后未置空:有时指针在free或者delete之后未赋值NULL,有可能被误以为是合法的指针,不能进关注free和delete后的指针名,他们只是将指针所指向的内存空间释放掉而已,但并没有把指针自身消灭,此时,指针指向的就是“垃圾”内存。被释放掉内存空间的指针应该立即将其置为NULL,防止产生野指针。
指针操作超越变量作用域
我觉得重点还是关注 没有初始化,以及本来指向了一块内存,然后指向的变量生命周期结束了,这个指针没有指向了,要及时置空。