我能够将Visual Studio内存泄漏报告拆分为误报和实际内存泄漏。 在我的主要功能中,我初始化内存调试并在应用程序的真正开始时产生实际的内存泄漏(切勿删除pcDynamicHeapStart):
int main()
{
_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
char* pcDynamicHeapStart = new char[ 17u ];
strcpy_s( pcDynamicHeapStart, 17u, "DynamicHeapStart" );
...
我的应用程序完成后,输出窗口中的报告包含:
Detected memory leaks!
Dumping objects ->
{15554} normal block at 0x00000000009FCCD0, 80 bytes long.
Data: < > DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD
{14006} normal block at 0x00000000009CB360, 17 bytes long.
Data: <DynamicHeapStart> 44 79 6E 61 6D 69 63 48 65 61 70 53 74 61 72 74
{13998} normal block at 0x00000000009BF4B0, 32 bytes long.
Data: < ^ > E0 5E 9B 00 00 00 00 00 F0 7F 9C 00 00 00 00 00
{13997} normal block at 0x00000000009CA4B0, 8 bytes long.
Data: < > 14 00 00 00 00 00 00 00
{13982} normal block at 0x00000000009A12C0, 16 bytes long.
Data: < @ > D0 DD D6 40 01 00 00 00 90 08 9C 00 00 00 00 00
...
Object dump complete.
现在看看“数据:<< strong> DynamicHeapStart >”行。
44 79 6E 61 6D 69 63 48 65 61 70 53 74 61 72 74”。下面的所有报告泄漏都是误报,上面的都是真实泄漏。 误报并不意味着没有泄漏(它可能是一个静态链接库,它在启动时分配堆,从不释放堆),但是您无法消除泄漏,这根本没有问题。
自从我发明了这种方法以来,我再也没有泄漏过应用程序了。
我想知道我是否可以隐藏误报(或静态分配对象的泄漏)。我的报告包含报告项的胡言乱语。我不想每次都向上滚动以查看一切是否正常。 也许输出窗口的过滤器会有所帮助?
也许可以选择忽略前n个泄漏或在定义的ID之后开始报告?如果是这样,可以不时调整数字或ID作为第一种方法。