window调试学习3——内存调试
动态内存分配错误有以下两种基本类型:内存错误和内存泄露。
当一个指针或者该指针所指向的内存单元成为无效单元,或者内存中分配的数据结构被破坏时,就会造成内存错误。指针未被初始化、指针被初始化为一个无效地址、指针被不小心错误地修改、在与指针相关联的内存区域被释放以后使用该指针(这种指针被称为虚悬(dangling)指针),这些都会使指针变为无效指针。当通过一个错误指针或者虚悬指针对內存进行写入,或者是将指针强制转换为不匹配的数据结构,又或者是写数据越界的时候,内存本身也会遭到破坏。删除未被初始化的指针,删除非堆指针、多次删除同一指针或者覆盖一个指针的内部数据结构,都会造成内存分配系统错误。总之,C++中的内存错误有无数种可能发生的原因。
写内存越界
在调试版本里,对内存的写越界时,如果是写上溢就会收到“DAMAGE: after block”(内存破坏:在块的后面)的跟踪消息,如果是写下溢就会收到“DAMAGE: before block”(内存破坏:在块的前面)的跟踪消息。但是,只有在内存的破坏发生在数据区的前后四个字节里时,上面的消息才会出现。如果写溢出超过了保护字节,对内存的写越界不会被发现。因为内存的崩溃通常就发生在内存破坏的后面,所以你可以使用数据断点对导致崩溃的代码进行跟踪。
内存泄漏
内存泄漏在被动态分配的内存没有被释放的时候产生。有很多种情况会导致内存地漏,例如没有在全部的执行路径中释放内存(特别是在那些具有多个返回语句和具有异常抛出的函数中),没有在析构程序中释放所有的内存,或者是忘记将基类析构函数设记为虚函数,还有可能是很简单的情形:忘记释放内存。
怎样查看内存泄漏:
在内存中,“VM Size”表示进程在整体上的内存使用量(包括位于物理内存内部和外部的内存),而“Mem Usage”表示进程的物理内存使用量(也称为进程的工作集)。通常,发生内存漏洞的征兆就是在虚拟内存上发生了增长,而不是在工作集上发生了波动。这个可以在任务管理器中查看。