Visual studio 2008 内存泄漏,带有;“多线程调试”;(/MTd)且无泄漏;多线程调试DLL“;(/MDd)

Visual studio 2008 内存泄漏,带有;“多线程调试”;(/MTd)且无泄漏;多线程调试DLL“;(/MDd),visual-studio-2008,memory-leaks,Visual Studio 2008,Memory Leaks,我在一个解决方案中有一堆库和项目,我改为使用/MTd而不是/MDd。我正在使用VS2008 我突然发现了一大堆/MDd开关不存在的内存泄漏 使用时,我注意到所有泄漏都是各种库的内部,包括CRT、VS库和boost 例如,这里是前3个泄漏的调用堆栈(该项目是Boost::Test项目): ------------0x02211EA0处的块1:568字节---------- 调用堆栈: f:\dd\vctools\crt\u bld\self\u x86\crt\src\tidtable.c(395

我在一个解决方案中有一堆库和项目,我改为使用/MTd而不是/MDd。我正在使用VS2008

我突然发现了一大堆/MDd开关不存在的内存泄漏

使用时,我注意到所有泄漏都是各种库的内部,包括CRT、VS库和boost

例如,这里是前3个泄漏的调用堆栈(该项目是Boost::Test项目):

------------0x02211EA0处的块1:568字节----------
调用堆栈:
f:\dd\vctools\crt\u bld\self\u x86\crt\src\tidtable.c(395):FrameworkUnitTests.exe_mtinit+0x18字节
f:\dd\vctools\crt\u bld\self\u x86\crt\src\crt0.c(215):FrameworkUnitTests.exe__tmainCRTStartup+0x5字节
f:\dd\vctools\crt\u bld\self\u x86\crt\src\crt0.c(182):FrameworkUnitTests.exe!主循环启动
0x7C817077(文件和行号不可用):kernel32.dll!RegisterWaitForInputIdle+0x49字节
数据:
00 00 00 F0 20 21 02 0C 9D B8 00 8A 01 00。。。。。。。。
14 02 00 00 02 00 00 00 01 00 00 00 FD FD FD FD。。。。。。。。
84 1B 00 FF FF FF 22 00 00 02 00 00 00。。。。。。。。".......
00 00 00 C5 03 8A E6 00 00 00 00 00 00。。。。。。。。
00 00 00 00    00 00 00 00    00 00 00 00    00 00 00 00     ........ ........
00 00 00 00    00 00 00 00    00 00 00 00    00 00 00 00     ........ ........
00 00 00 B0 80 8C 03 00 00 00 00 00。。。。。。。。
00 00 00 00 00 00 00 00 E8 C9 B8 00。。。。。。。。
00 00 00 00 B0 4A 21 02 F8 DB C4 00…J!。。。。。
01 00 00 00    00 00 00 00    00 00 00 00    00 00 00 00     ........ ........
D0 57 99 00 00 00.W。。。。。。。。
00 00 00 00    00 00 00 00    00 00 00 00    00 00 00 00     ........ ........
00 00 00 00    00 00 00 00    00 00 00 00    00 00 00 00     ........ ........
00 00 00 00    00 00 00 00    00 00 00 00    00 00 00 00     ........ ........
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00。。。。。。。
00 00 00 00    00 00 00 00    00 00 00 00    00 00 00 00     ........ ........
----------0x022120F0处的块2:2084字节----------
调用堆栈:
f:\dd\vctools\crt\u bld\self\u x86\crt\src\ioinit.c(137):FrameworkUnitTests.exe!\u ioinit+0x15字节
f:\dd\vctools\crt\u bld\self\u x86\crt\src\crt0.c(235):FrameworkUnitTests.exe!\uuu tmainCRTStartup+0x5字节
f:\dd\vctools\crt\u bld\self\u x86\crt\src\crt0.c(182):FrameworkUnitTests.exe!mainCRTStartup
0x7C817077(文件和行号不可用):kernel32.dll!RegisterWaitForInputIdle+0x49字节
数据:
A0 1E 21 02 90 4A 21 02 A4 C4 B8 00 88 00 00…..J。。。。。。。。
00 08 00 02 00 00 00 02 00 00 00 FD FD FD FD。。。。。。。。
03 00 00 C1 0A 00 00 01 00 00 00 00 F8 15 00。。。。。。。。
FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00。。。。。。。。
A0 0F 00 00 0A 0A 00 00 00 00 00。。。。。。。。
00 00 00 00    00 00 00 00    00 00 00 00    00 00 00 00     ........ ........
07 00 00 C1 0A 00 00 01 00 00 38 F8 15 00………8。。。
FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00。。。。。。。。
A0 0F 00 00 0A 0A 00 00 00 00 00。。。。。。。。
00 00 00 00    00 00 00 00    00 00 00 00    00 00 00 00     ........ ........
0B 00 00 00 C1 0A 00 00 01 00 00 00 70 F8 15 00………p。。。
FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00。。。。。。。。
A0 0F 00 00 0A 0A 00 00 00 00 00。。。。。。。。
00 00 00 00    00 00 00 00    00 00 00 00    00 00 00 00     ........ ........
FF FF FF 00 0A 00 00 01 00 00 00 D8 FF 15 00。。。。。。。。
FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00。。。。。。。。
----------0x02212FC0处的块118:60字节----------
调用堆栈:
f:\dd\vctools\crt\u bld\self\u x86\crt\src\mlock.c(279):FrameworkUnitTests.exe!\u mtinitlocknum+0x13字节
f:\dd\vctools\langapi\undname\undname.cxx(649):FrameworkUnitTests.exe!\uu undname+0x7字节
f:\dd\vctools\crt\u bld\self\u x86\crt\prebuild\eh\typname.cpp(124):FrameworkUnitTests.exe!键入\u info::\u Name\u base+0x1F字节
f:\dd\vctools\crt\u bld\self\u x86\crt\prebuild\eh\typinfo.cpp(45):FrameworkUnitTests.exe!type\u info::name+0xD字节

c:\…\3rdpartylibs\boost\u 1\u 49\u 0\boost\test\unit\u test\u suite\u impl.hpp(377):FrameworkUnitTests.exe!boost::unit\u test::ut\u detail::generate\u test\u case\u 4\u type我看到了类似的事情,我认为它可能只是一次性初始化的事情:

---------- Block 119 at 0x007B6AF8: 60 bytes ----------
Call Stack:
f:\dd\vctools\crt\crtw32\startup\mlock.c (276): _mtinitlocknum
f:\dd\vctools\crt\crtw32\stdio\stream.c (72): _getstream
f:\dd\vctools\crt\crtw32\stdio\fopen.c (61): _fsopen
f:\dd\vctools\crt\crtw32\stdio\fopen.c (125): fopen

如果_mtinitlocknum()分配了一个随后使用的缓冲区,这可能是一个误报。换句话说,之后它会重新使用缓冲区。

我看到了类似的情况,我认为这可能只是一次性初始化:

---------- Block 119 at 0x007B6AF8: 60 bytes ----------
Call Stack:
f:\dd\vctools\crt\crtw32\startup\mlock.c (276): _mtinitlocknum
f:\dd\vctools\crt\crtw32\stdio\stream.c (72): _getstream
f:\dd\vctools\crt\crtw32\stdio\fopen.c (61): _fsopen
f:\dd\vctools\crt\crtw32\stdio\fopen.c (125): fopen

如果_mtinitlocknum()分配一个随后使用的缓冲区,这可能是一个误报。换句话说,它在此之后会重新使用缓冲区。

我看到了同样的情况。下面的代码片段说明了这一点。如果您观察Visual Studio内存使用情况,它会在MTd中稳步上升,但在MDd中保持稳定。这就好像fclose()我已经通过断言语句证明了返回值都是好的

#include <windows.h>
#include <stdio.h>

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow);

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);

while (1) 
{
    FILE* fh = fopen("c:\\temp\\1.txt", "a");
    if (fh != NULL)
    {
        int fc = fclose(fh);
    }
}
return (0);

} // WinMain
#包括
#包括
int APIENTRY WinMain(HINSTANCE HINSTANCE、HINSTANCE hPrevInstance、LPSTR lpCmdLine、int nCmdShow);
int APICENTRY WinMain(HINSTANCE HINSTANCE、HINSTANCE hPrevInstance、LPSTR lpCmdLine、int nCmdShow)
{
未引用的_参数(HPPreInstance);
未引用的_参数(lpCmdLine);