Когда окно закрывается, мои деструкторы вызывают? - PullRequest
1 голос
/ 23 июля 2010

Если окно закрыто (как при отправке WM_CLOSE), называются ли деструкторы объектов?

В этом случае я следил за исходным кодом с точкой останова, но компилятор не кажетсяпройти через мой деструктор.

Программа закрыта без вызова деструкторов?

Ответы [ 4 ]

2 голосов
/ 23 июля 2010

Обычно, нет, если ваш WindowProc не делает это так.

Класс Window (например, CWnd в; FC и CWindow в ATL) - это отдельные объекты из концепции окна ОС (я буду обозначать как HWND). У них разные времена жизни, но их можно «соединить» вместе с помощью WNDPROC.

IIRC, MFC удалит производные от CView классы, но не большинство производных от CWindow. Кроме того, CWindow ATL само по себе не будет уничтожено, поскольку по умолчанию это только одностороннее вложение (то есть присоединение CWindow к HWND обычно не подклассирует окно).

В большинстве случаев вызов деструктора осуществляется с помощью другого механизма:

CDialog foo;
foo.DoModal();

Когда диалоговое окно закрыто, область, в которой объявлено foo, будет закрыта и будет вызван деструктор foos.

Аналогично, закрытие главного окна приведет к завершению работы приложения, что приведет к разрыву экземпляров.

0 голосов
/ 05 августа 2010

Объекты в Windows (окна, диалоговые окна, элементы управления и т. Д.) Отделены и отличаются от объектов C ++ в вашей программе, которые обертывают их.Закрытое окно или диалоговое окно не удалит объект C ++ в вашей программе, который связан с ним посредством переменной-члена m_Hwnd.

Чтобы выразить это в терминах MFC, подумайте об этом так -закрытие диалога уничтожило объект CDialog, связанный с ним, как вы могли бы затем извлечь данные DDX CDialog, связанные с элементами управления (small d) диалогового окна?

0 голосов
/ 23 июля 2010

Зависит от того, что делает программа после закрытия окон. Если он завершается нормально (возвращая управление из main()) - тогда да, деструкторы будут вызываться, но только из стековых и глобальных объектов. Если он вызывает TerminateProcess(), они точно не будут вызваны.

0 голосов
/ 23 июля 2010

Я не слишком уверен, что понимаю, но допустим, у вас есть окно настройки с типичным WndProc, и вы качаете сообщения с чем-то похожим на:

while (GetMessage(&msg, hwnd, 0, 0) > 0)
{ 
    TranslateMessage(&msg); 
    DispatchMessage(&msg); 
}

Когда окно завершится (обрабатывает WM_DESTROY, после обработки WM_CLOSE сообщений и вызова DestroyWindow) этот цикл завершится, и вы продолжите нормальное выполнение.

Другими словами, окно не является чем-то особенным, но пока оно работает, вы в значительной степени застряли в этом цикле. Вы получаете такую ​​же очистку, как всегда.

...