Есть приложение на ATL, которое показало утечку 2-х байт памяти (стандартными средствами crtdbg.h). Я вырезал из него все что можно. Осталось только это (сорри, отступы другой форум порезал):
class CMyWindow : public CWindowImpl<CMyWindow>
{
public:
// Optionally specify name of the new Windows class
DECLARE_WND_CLASS("MyName")
// If this macro is not specified in your
// class, ATL will generate a class name
BEGIN_MSG_MAP(CMyWindow)
MESSAGE_HANDLER(WM_PAINT, OnPaint)
END_MSG_MAP()
LRESULT OnPaint(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
// Do some painting code
return 0;
}
};
//
extern "C" int WINAPI _tWinMain(HINSTANCE /*hInstance*/, HINSTANCE hPrevInstance, LPTSTR /*lpCmdLine*/, int nShowCmd)
{
#ifdef _DEBUG
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF);
#endif
{
ATLASSERT(AUX_SUCCEEDED(OleInitialize(0) == S_OK));
AtlAxWinInit();
//srand(GetTickCount());
{
CMyWindow w;
w.Create(0);
w.DestroyWindow();
}
AtlAxWinTerm();
OleUninitialize();
}
#ifdef _DEBUG
if (_CrtDumpMemoryLeaks())
::MessageBeep(MB_ICONEXCLAMATION);
#endif
}
Если закомментировать "w.Create(0);", то утечки нет. Если оставить, то утечка такая:
Detected memory leaks!
Dumping objects ->
{49} normal block at 0x00944D70, 2 bytes long.
Data: < > D8 C2
Object dump complete.
Имя файла и строку, где память выделяетя, оно определить не может.
Потом я создал другое приложение, вот такое:
#define WIN32
#define _WINDOWS
#define _CRTDBG_MAP_ALLOC
#define _ATL_MIN_CRT
#define _DEBUG
#include <windows.h>
//#include <stdlib.h>
//#include <crtdbg.h>
#include <comutil.h>
#include <stdio.h>
#include <tchar.h>
#include <atlbase.h>
#include <atlwin.h>
#include <windows.h>
// this code is from MSDN
// ms-help://MS.MSDNQTR.2003APR.1033/vccore/html/_atl_Implementing_a_Window_with_CWindowImpl.htm
// "Implementing a Window with CWindowImpl"
class CMyWindow : public CWindowImpl<CMyWindow>
{
public:
// Optionally specify name of the new Windows class
DECLARE_WND_CLASS("MyName")
// If this macro is not specified in your
// class, ATL will generate a class name
BEGIN_MSG_MAP(CMyWindow)
MESSAGE_HANDLER(WM_PAINT, OnPaint)
END_MSG_MAP()
LRESULT OnPaint(UINT nMsg, WPARAM wParam,LPARAM lParam, BOOL& bHandled)
{
// Do some painting code
return 0;
}
};
extern "C" int WINAPI _tWinMain(HINSTANCE /*hInstance*/, HINSTANCE hPrevInstance,LPTSTR /*lpCmdLine*/, int nShowCmd)
{
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
HANDLE logFile;
logFile = CreateFile("bstr_t_leak_LOG.txt", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
_CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);
_CrtSetReportFile(_CRT_WARN, logFile);
_CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE);
_CrtSetReportFile(_CRT_ERROR, logFile);
_CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE);
_CrtSetReportFile(_CRT_ASSERT, logFile);
{
ATLASSERT(OleInitialize(0) == S_OK);
AtlAxWinInit();
{
CMyWindow w;
w.Create(0, 0, 0, WS_OVERLAPPEDWINDOW);
w.DestroyWindow();
}
AtlAxWinTerm();
OleUninitialize();
}
exit(0);
}
И в нем утечки нету!
Я в шоке.
Никаких статических переменных у себя кроме GUID (static const GUID LIBID_MyApp = ...) не имею. Что я не так делаю?