none
内存泄露 RRS feed

  • 问题

  • VS2005编译器输出一堆内存泄露信息,如下:
    Detected memory leaks!
    Dumping objects ->
    {337} normal block at 0x017041B8, 904 bytes long.
     Data: <              , > 88 03 F4 13 D0 D2 D4 CB B4 F3 B3 E9 BD B1 2C B6
    {336} normal block at 0x01704138, 62 bytes long.
     Data: <>               > 3E 00 04 10 00 00 00 00 00 00 00 00 00 00 00 00
    {326} normal block at 0x01703F18, 31 bytes long.
     Data: <                > A0 B8 8F 00 0E 00 00 00 0E 00 00 00 01 00 00 00
    {324} normal block at 0x01703E40, 48 bytes long.
     Data: <   c            > 02 00 14 63 C0 A8 00 C9 CD CD CD CD CD CD CD CD
    {323} normal block at 0x01703DC0, 62 bytes long.
     Data: <>   v  c        > 3E 00 04 10 76 01 14 63 C0 A8 00 C9 C0 A8 01 C9
    {315} normal block at 0x01703C08, 23 bytes long.
     Data: <                > A0 B8 8F 00 06 00 00 00 06 00 00 00 01 00 00 00
    {313} normal block at 0x01703B30, 48 bytes long.
     Data: <   Z            > 02 00 14 5A C0 A8 00 C9 CD CD CD CD CD CD CD CD
    {312} normal block at 0x01703AB0, 62 bytes long.
     Data: <>   m  Z        > 3E 00 04 10 6D 02 14 5A C0 A8 00 C9 C0 A8 01 C9
    {304} normal block at 0x01701DB8, 23 bytes long.
     Data: <                > A0 B8 8F 00 06 00 00 00 06 00 00 00 01 00 00 00
    {302} normal block at 0x00FBE698, 48 bytes long.
     Data: <   Z            > 02 00 14 5A C0 A8 00 C9 CD CD CD CD CD CD CD CD
    {301} normal block at 0x017036D8, 62 bytes long.
     Data: <>   m  Z        > 3E 00 04 10 6D 01 14 5A C0 A8 00 C9 C0 A8 01 C9
    {300} normal block at 0x01702000, 24 bytes long.
     Data: <                > 18 00 18 10 D5 E2 C0 EF CA C7 B4 F3 CC FC B9 F6
    {295} normal block at 0x01703950, 111 bytes long.
     Data: <o        test   > 6F 00 02 10 00 F8 07 00 00 74 65 73 74 00 00 00
    Object dump complete.

    有什么方法能够定位这些内存泄露的地方!
    2010年1月26日 15:10

答案

  • 注意提示:
    {326} normal block at 0x01703F18, 【31】 bytes long.
     Data: <                > A0 B8 8F 00 0E 00 00 00 0E 00 00 00 01 00 00 00

    一般来说如果遇到了一个质数,那证明这一段内存要么是放字符串的要么是你自己写的一个类刚好用了31个字节。

    -------------------------------------------

    暴力方法:
    你在main函数里面屏蔽大量代码,一直到内存泄漏不发生为止,然后慢慢放开。

    -------------------------------------------

    双击好像要SP1?我这里没装SP1然后也没用

    -------------------------------------------

    一般来说,如果你不用外部工具譬如BoundsChecker的话,绝大多数情况下都要靠人去检查
    • 已标记为答案 飘零雪 2010年1月29日 13:30
    2010年1月29日 3:05
  • 我这边是SP1, 有些memory leak 双击是可以定位代码行的。


    建议可以使用以下 Visual Leak Detector

    http://www.codeproject.com/KB/applications/visualleakdetector.aspx

    这个工具很好用,也很简单。而且是源代码级的。对于查找memory leak 很有帮助。

    Bounds check 也不是不可以,但是我发现Bounds check 也不是100%能查出memory leak。
    • 已标记为答案 飘零雪 2010年1月29日 13:30
    2010年1月29日 3:40
    版主

全部回复

  • BoundsChecker
    2010年1月27日 5:40
  • 双击错误提示行。
    2010年1月27日 10:06
    版主
  • 双击错误提示行。

    双击是没用的,因为只是存在有内存泄露,又不是语法有问题。
    2010年1月28日 6:53
  • 注意提示:
    {326} normal block at 0x01703F18, 【31】 bytes long.
     Data: <                > A0 B8 8F 00 0E 00 00 00 0E 00 00 00 01 00 00 00

    一般来说如果遇到了一个质数,那证明这一段内存要么是放字符串的要么是你自己写的一个类刚好用了31个字节。

    -------------------------------------------

    暴力方法:
    你在main函数里面屏蔽大量代码,一直到内存泄漏不发生为止,然后慢慢放开。

    -------------------------------------------

    双击好像要SP1?我这里没装SP1然后也没用

    -------------------------------------------

    一般来说,如果你不用外部工具譬如BoundsChecker的话,绝大多数情况下都要靠人去检查
    • 已标记为答案 飘零雪 2010年1月29日 13:30
    2010年1月29日 3:05
  • 对于IDE查内存泄漏的输出我没有研究过,但我怀疑这里面出现的地址。可以对照生成的map文件,找到对应的文件位置。


    麻烦把正确答案设为解答。
    2010年1月29日 3:12
    版主
  • 我这边是SP1, 有些memory leak 双击是可以定位代码行的。


    建议可以使用以下 Visual Leak Detector

    http://www.codeproject.com/KB/applications/visualleakdetector.aspx

    这个工具很好用,也很简单。而且是源代码级的。对于查找memory leak 很有帮助。

    Bounds check 也不是不可以,但是我发现Bounds check 也不是100%能查出memory leak。
    • 已标记为答案 飘零雪 2010年1月29日 13:30
    2010年1月29日 3:40
    版主