Это утечка памяти в MFC

Так как текст выглядит как столбчатые данные, обычно полезен awk. Я бы использовал V, чтобы выбрать строки, затем нажал :! и использовал awk:

:'<,'>! awk '{ print $2 }'

, чтобы распечатать второй столбец данных. Спасает вас от подсчета пробелов вообще.

8
задан Richard 3 June 2009 в 10:25
поделиться

3 ответа

Да, в вашем случае это утечка памяти, но вы можете избежать утечки памяти в случаях, когда немодальный диалог размещен в куче, используя переопределение PostNcDestroy .

Диалоги не предназначены для автоматической очистки (в отличие от окон главного фрейма и окон просмотра). Если вы хотите обеспечить автоматическую очистку диалоговых окон, вы должны переопределить функцию-член PostNcDestroy в производном классе. Чтобы добавить автоматическую очистку к вашему классу, вызовите ваш базовый класс и затем выполните , удалите это . Чтобы удалить автоматическую очистку из вашего класса, вызовите CWnd :: PostNcDestroy напрямую вместо члена PostNcDestroy в вашем прямом базовом классе.

void MyDialog::PostNcDestroy() 
{

    CDialog::PostNcDestroy();
    delete this;
}

Как это работает (из MSDN):

При разрушении окна Windows последнее сообщение Windows, отправленное на окно - WM_NCDESTROY. По умолчанию CWnd обработчик этого сообщения (CWnd :: OnNcDestroy) отсоединит HWND из объекта C ++ и вызовите виртуальная функция PostNcDestroy. Некоторые классы переопределяют эту функцию, чтобы удалить объект C ++.

«удалить это» освободит любой C ++ память, связанная с объектом C ++. Хотя по умолчанию CWnd деструктор вызывает DestroyWindow, если m_hWnd не равно NULL, это не приводит к бесконечной рекурсии, поскольку ручка будет отсоединен и NULL во время этап очистки.

Вы также можете обратиться к MSDN ( Уничтожение оконных объектов ) для получения дополнительных сведений.

Примечание:

Это работает для немодального диалога, который может быть размещен в куче .

16
ответ дан 5 December 2019 в 07:13
поделиться

Yes, that's a leak. And yes, the window would be destroyed if the object was stack-allocated. Using dialogs as stack-allocated objects is typical for modal dialogs - you call a method for showing a dialog as a modal window and that method only returns when the dialog is closed and the object is destroyed after that.

4
ответ дан 5 December 2019 в 07:13
поделиться

Если вы вручную вызываете Создать в диалоговом окне, вам также придется вручную Уничтожить его.
При использовании DoModal () в этом нет необходимости.

Из MSDN :

Используйте функцию CWnd :: DestroyWindow чтобы уничтожить диалоговое окно, созданное Создать функцию.

3
ответ дан 5 December 2019 в 07:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: