1、什么是内存泄露?
内存泄漏(memory leak)是指由于疏忽或错误造成了程序未能释放掉不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因⽽造成了内存的浪费。
2、内存泄漏的分类:
1.动态内存分配泄露
2.指针失效:指针指向的内存被释放后,指针没有置为 nullptr
,导致指针悬空,无法正确释放
3.指针改变指向
4.没有将基类的析构函数定义为虚函数(当基类指针指向子类对象时,如果基类的析构函数不是 virtual,那么子类的析构函数将不会被调用,子类的资源没有正确被释放,因此造成内存泄露。)
5.系统资源泄露(程序使用了系统分配的资源)
-
文件句柄泄漏: 如果一个程序打开了一个文件,但在使用完毕后没有关闭文件句柄,就会发生文件句柄泄漏。这会导致系统的文件句柄资源被占用,可能导致其他程序无法正常操作文件,甚至系统达到文件句柄数上限。
-
网络连接泄漏: 当程序建立网络连接(比如 SOCKET 连接)时,如果连接在使用完毕后没有关闭,就会导致网络连接泄漏。这可能导致系统的网络资源被浪费,降低网络性能,甚至影响其他程序的网络通信。
3、如何防止内存泄漏?
1.内存的分配封装在类中,构造函数分配内存,析构函数释放内存;
2.智能指针
智能指针是一种用于管理动态分配内存的工具,它能够自动地在不再需要时释放内存,从而避免内存泄漏。