Всем привет
странная фигня если явно не вызывать 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
что это такая за фигня?