内存泄露和内存溢出
1.内存泄露与内存溢出
内存泄漏(memory leak):是指程序在申请内存后,无法释放已申请的内存空间,导致系统无法及时回收内存并且分配给其他进程使用。通常少次数的内存无法及时回收并不会到程序造成什么影响,但是如果在内存本身就比较少获取多次导致内存无法正常回收时,就会导致内存不够用,最终导致内存溢出,即内存泄露会导致内存溢出。
内存溢出 (out of memory):指程序申请内存时,没有足够的内存供申请者使用,导致数据无法正常存储到内存中,即内存越界。也就是说给你个int类型的存储数据大小的空间,但是却存储一个long类型的数据,这样就会导致内存溢出。
内存溢出 (out of memory):指程序申请内存时,没有足够的内存供申请者使用,导致数据无法正常存储到内存中,即内存越界。也就是说给你个int类型的存储数据大小的空间,但是却存储一个long类型的数据,这样就会导致内存溢出。
2.内存泄露的常见情况
(1)malloc/new申请的内存没有主动释放
解决办法:使用free/delete释放内存 (注:malloc/free以及new/delete必须是各自成对出现)
int *p=new int(10);
delete p;
注意:如果用delete释放void指针指向的对象同样也会造成内存泄露。
(2)使用delete去删除数组
int* ptr = new int[2];
delete ptr; // 错误!释放数组要用 delete[]
delete[] ptr; // 正确
(3)基类的析构函数没有定义为虚函数
当基类指针指向子类对象时,如果基类的析构函数不是virtual,那么子类的析构函数将不会被调用,子类的资源没有正确是释放,因此造成内存泄露。
A* pa = new B();
delete pa;
3.内存泄露解决
(1)使用智能指针直接管理内存
(2)谨慎使用动态内存