C++/CLI утечка USER объектов
От: jyuyjiyuijyu  
Дата: 25.05.15 23:00
Оценка:
Всем привет

странная фигня если явно не вызывать delete а дать сборщику мусора самому вызывать
финалайзер который вызывает DestroyWindow, то окна не уничтожаются и происходит утечка USER объектов

вот код, после того как увидите утечку, измените PRODUCE_BUG 1 на 0 и все тут же станет замечательно

using namespace System;
using namespace System::IO;
using namespace System::Threading;
using namespace System::Runtime::InteropServices;
using namespace System::ComponentModel;

ref class DataContainer {
    HWND hwnd;
public:
    DataContainer():m_isDisposed(false) {
        hwnd = CreateWindowA("button", "test", 0,0,0,0,0,0,0,GetModuleHandle(0),0);
    }


    ~DataContainer() {
        if (m_isDisposed)
            return;

        this->!DataContainer(); 
        m_isDisposed = true;
    }

    !DataContainer() {
        DestroyWindow(hwnd);
        Win32Exception e;
        Console::WriteLine("{0} - {1}", e.NativeErrorCode, e.Message);
    }

private:
    bool m_isDisposed; 
};

#define PRODUCE_BUG 1

int main(array<System::String ^> ^args)
{
    for (;;)
    {
        auto obj = gcnew DataContainer();
        Thread::Sleep(1000);
        
        if (!PRODUCE_BUG)
            delete obj;
        else
            GC::Collect();
    }

    return 0;
}


на консоль с PRODUCE_BUG 1 выводится

5 — Access is denied

а с PRODUCE_BUG 0 все замечательно

0 — The operation completed successfully

что это такая за фигня?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.