内存泄漏调试:忽略误报(Visual Studio)

时间:2019-04-16 08:43:19

标签: c++ visual-studio memory-leaks

我能够将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作为第一种方法。

0 个答案:

没有答案