1.内存溢出和内存泄漏是啥
内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。
内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间。
2.内存泄漏的分类:
1、堆内存泄漏 (Heap leak)。对内存指的是程序运行中根据需要分配通过malloc,realloc new等从堆中分配的一块内存,再是完成后必须通过调用对应的 free或者delete 删掉。如果程序的设计的错误导致这部分内存没有被释放,那么此后这块内存将不会被使用,就会产生Heap Leak。
2、系统资源泄露(Resource Leak)。主要指程序使用系统分配的资源比如 Bitmap,handle ,SOCKET等没有使用相应的函数释放掉,导致系统资源的浪费,严重可导致系统效能降低,系统运行不稳定。
3、没有将基类的析构函数定义为虚函数。当基类指针指向子类对象时,如果基类的析构函数不是virtual,那么子类的析构函数将不会被调用,子类的资源没有正确是释放,因此造成内存泄露。
3.2 如何避免内存泄漏
-
使用智能指针:智能指针是 C++ 中的一个重要特性,它能够自动管理动态分配的内存,当智能指针超出作用域时,会自动释放所指向的内存。常见的智能指针包括
std::unique_ptr
、std::shared_ptr
和std::weak_ptr
。优先选择std::unique_ptr
,它适用于单一所有权的情况,能够确保资源的独占性。 -
避免裸指针:尽量避免直接使用裸指针来管理内存,特别是在动态分配内存时。使用智能指针能够提高代码的安全性和可读性,并降低内存泄漏的风险。
-
使用 RAII(资源获取即初始化):RAII 是一种重要的编程技巧,通过在对象的构造函数中获取资源,在析构函数中释放资源,来确保资源的正确管理。这样可以避免因为异常或者提前返回等情况而导致资源未能正确释放。
详解C++11 RAII机制_c++中,什么是 riit-CSDN博客
-
谨慎使用动态内存分配:在需要动态内存分配时,应该尽量减少动态内存的使用,优先考虑使用栈上的对象,避免频繁地进行动态内存分配和释放。
-
及时释放内存:在使用完动态分配的内存后,要及时调用
delete
或者释放资源的方法来释放内存,避免内存泄漏。注意确保所有分配的内存都有相应的释放操作。 -
使用工具进行内存泄漏检测:可以使用各种内存检测工具来帮助发现和调试内存泄漏问题,例如 Valgrind、AddressSanitizer 等。