内存泄露

    xiaoxiao2021-12-15  38

    1:堆内存泄漏:对内存指的是程序运行中根据需要分配通过malloc,realloc new等从堆中分配的一块内存,再是完成后必须通过调用对应的 free或者delete 删掉。如果程序的设计的错误导致这部分内存没有被释放,那么此后这块内存将不会被使用,就会产生Heap Leak.

    2:系统资源泄露:主要指程序使用系统分配的资源比如 Bitmap,handle ,SOCKET等没有使用相应的函数释放掉,导致系统资源的浪费,严重可导致系统效能降低,系统运行不稳定。

    3:如何解决内存泄露? 3.1:malloc\realloc —— free;new \new[] ———- delete \delete[] 3.2:RAII:资源获取即初始化: 若希望保持对某个重要资源的跟踪,那么创建一个对象,并将资源的生命周期和对象的生命周期相关联. 3.3:重载 new 和 delete。 3.4,Boost 中的smart pointer: 利用share_ptr来管理内存:boost::shared_ptr < connection > p ( new connection()); 3.5Visual Leak Detector是一款免费的检查内存泄露的工具. 3.6:利用库检测内存泄露信息

    #define _CRTDBG_MAP_ALLOC //如果没有这个宏定义,我们只能知道有内存泄露,却无法知道在哪个地方申请内存忘记了释放 #include <stdlib.h> #include <crtdbg.h> int main(void) { char *p = (char *)malloc(sizeof(char) * 100); _CrtDumpMemoryLeaks(); }

    WinGbg

    使用u 命令查看当前正在执行的代码,k 命令查看当前调用堆栈 续用~命令来查看被调试进程中的线程信息 bp 命令是最常用的断点命令bp TestDebug1!main bl 命令用于查看已存在的断 bd 命令禁用断点、be 命令重新启用断点 bc 命令删除上面的1 号断点 bu TestDebugDll1!TestDllAdd 对TestDebugDll1.exe 中的TestDllAdd 函数设置未定断点 ba 命令用于设置访问断点ba w4 @@C++(&i)命令。“&i”在C++语法中表示变量i 的地址,“w”表示写入操作,“4”表示只处理&i 地址处4 字节的写入操作。 以d 开头的d*系列命令用于查看内存值。命令的第二个字符用于指定按何种数据类型查看该内存中的数据:如db 是按BYTE 类型查看,dd 是按DWORD 类型查看。 !analyze -v,这是windbg提供的一个自动分析命令,正常情况下,会显示出导致崩溃的行为,其所在文件,以及其在文件中的具体行数

    转载请注明原文地址: https://ju.6miu.com/read-1000015.html

    最新回复(0)