2011-05-11 15 views
0

執行以下代碼段時,我的應用程序發生泄漏。即使在CDatabase上撥打Close()後也不會釋放內存。即使在調用Close之後,CDatabase泄漏

如何在不破壞CDatabase對象的情況下糾正泄漏?

CDatabase db; 
int count = 2000; 
for (int i=0; i <count; ++i) 
{ 
    BOOL bRes = db.OpenEx("DSN=ICEDBServer;UID=sa;PWD=ICEConnect200"); 
    db.Close(); 
} 

泄漏位置的調用堆棧下面

+ 133154 (133154 -  0) 2001 allocs BackTrace477 
+ 2001 ( 2001 -  0) BackTrace477 allocations 

    ntdll!RtlAllocateHeap+00001292 
    ntdll!LdrpCopyUnicodeString+000000B1 
    ntdll!LdrpResolveDllName+000002CE 
    ntdll!LdrpMapDll+000002C1 
    ntdll!LdrpLoadDll+00000251 
    ntdll!LdrLoadDll+000001C8 
    kernel32!LoadLibraryExW+0000024D 
    ODBC32!LoadDriver+00000235 
    ODBC32!SQLDriverConnectW+00000C11 
    ODBC32!SQLDriverConnect+000001BB 
    mfc90!CDatabase::Connect+0000009E (f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\dbcore.cpp, 745) 
    mfc90!CDatabase::OpenEx+00000089 (f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\dbcore.cpp, 289) 
    testApp!CtestAppDlg::OnBnClickedButton1+0000006A (d:\test\testapp\testapp\testappdlg.cpp, 162) 
    mfc90!_AfxDispatchCmdMsg+000000C4 (f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\cmdtarg.cpp, 82) 
    mfc90!CCmdTarget::OnCmdMsg+000001A4 (f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\cmdtarg.cpp, 381) 
    mfc90!CPropertySheet::OnCmdMsg+00000032 (f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\dlgprop.cpp, 814) 
    mfc90!CWnd::OnCommand+00000100 (f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wincore.cpp, 2364) 
    mfc90!CWnd::OnWndMsg+0000005F (f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wincore.cpp, 1769) 
    mfc90!CWnd::WindowProc+00000038 (f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wincore.cpp, 1755) 
    mfc90!AfxCallWndProc+00000100 (f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wincore.cpp, 240) 
    mfc90!AfxWndProc+00000059 (f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wincore.cpp, 402) 
    mfc90!AfxWndProcBase+00000053 (f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\afxstate.cpp, 441) 
    USER32!UserCallWinProcCheckWow+000001F9 
    USER32!DispatchClientMessage+000000C3 
    USER32!_fnDWORD+0000002D 
    ntdll!KiUserCallbackDispatcherContinue+00000000 
    USER32!ZwUserMessageCall+0000000A 

回答

0

當你的程序中打開的第一個數據庫連接中給出,它加載數據庫的庫到內存中。由於連接池,以下連接並不需要太多的內存。關閉所有連接不會立即卸載您之前加載的所有內容,並且某些部分會留在內存中,直到程序退出。

+0

有些內存泄​​露2000次。我從UMDH得到了這些信息。所以我不認爲這是由於DLL加載 – Maanu 2011-05-12 03:13:34