内存状态比较
本主题适用于:
Visual Studio 版本 | Visual Basic | C# | C++ | J# |
速成版 | 否 | 否 | 本机 | 否 |
标准版 | 否 | 否 | 本机 | 否 |
专业团队版 | 否 | 否 | 本机 | 否 |
定位内存泄漏的另一种技术涉及在关键点对应用程序的内存状态拍快照。CRT 库提供一种结构类型 _CrtMemState ,您可用它存储内存状态的快照:
_CrtMemState s1, s2, s3;
若要在给定点对内存状态拍快照,请向 _CrtMemCheckpoint 函数传递 _CrtMemState 结构。该函数用当前内存状态的快照填充此结构:
_CrtMemCheckpoint( &s1 );
通过向 _CrtMemDumpStatistics 函数传递 _CrtMemState 结构,可以在任意点转储该结构的内容:
_CrtMemDumpStatistics( &s1 );
该函数输出如下样式的转储的内存分配信息:
0 bytes in 0 Free Blocks.
0 bytes in 0 Normal Blocks.
3071 bytes in 16 CRT Blocks.
0 bytes in 0 Ignore Blocks.
0 bytes in 0 Client Blocks.
Largest number used: 3071 bytes.
Total allocations: 3764 bytes.
若要确定代码中某一部分是否发生了内存泄漏,可以在该部分之前和之后对内存状态拍快照,然后使用 _CrtMemDifference 比较这两个状态:
_CrtMemCheckpoint( &s1 );
// memory allocations take place here
_CrtMemCheckpoint( &s2 );
if ( _CrtMemDifference( &s3, &s1, &s2) )
_CrtMemDumpStatistics( &s3 );
顾名思义,_CrtMemDifference 比较两个内存状态(s1 和 s2 ),生成这两个状态之间差异的结果(s3 )。在程序的开始和结尾放置 _CrtMemCheckpoint 调用,并使用 _CrtMemDifference 比较结果,是检查内存泄漏的另一种方法。如果检测到泄漏,则可以使用 _CrtMemCheckpoint 调用通过二进制搜索技术来划分程序和定位泄漏。