ATL утечка 2-х байт памяти, не могу понять ничего
От: Аноним  
Дата: 06.10.04 15:27
Оценка:
Есть приложение на 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 = ...) не имею. Что я не так делаю?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.