Так как текст выглядит как столбчатые данные, обычно полезен awk. Я бы использовал V
, чтобы выбрать строки, затем нажал :!
и использовал awk:
:'<,'>! awk '{ print $2 }'
, чтобы распечатать второй столбец данных. Спасает вас от подсчета пробелов вообще.
Да, в вашем случае это утечка памяти, но вы можете избежать утечки памяти в случаях, когда немодальный диалог размещен в куче, используя переопределение 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 ( Уничтожение оконных объектов ) для получения дополнительных сведений.
Примечание:
Это работает для немодального диалога, который может быть размещен в куче .
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.
Если вы вручную вызываете Создать
в диалоговом окне, вам также придется вручную Уничтожить
его.
При использовании DoModal ()
в этом нет необходимости.
Из MSDN :
Используйте функцию CWnd :: DestroyWindow чтобы уничтожить диалоговое окно, созданное Создать функцию.