C ++ wxWidgets Gui-приложение остается в памяти после закрытия - PullRequest
1 голос
/ 07 октября 2011

Субъект говорит все это. После того, как я закрыл свое приложение, оно остается в списке процессов с некоторой памятью. Я попробовал Google Perf инструменты и часы отладки, чтобы найти утечку.

Существуют ли другие инструменты, чтобы проверить это и найти проблему?

Спасибо.

Ответы [ 3 ]

1 голос
/ 07 октября 2011

Вы можете попробовать взглянуть на образец папки wxWidget.Вы найдете множество небольших, но полных приложений, которые содержат полный цикл инициализации / выхода из приложения.

Проверьте некоторые примеры и сравните с рабочим процессом вашего приложения.

1 голос
/ 08 октября 2011

Да ... проблема решена. Окно TopLevelWindow, которое не было уничтожено. Утечка памяти .... глупая ошибка.

1 голос
/ 07 октября 2011

Я предполагаю, что вы закрыли окно верхнего уровня и, следовательно, все его дочерние окна, но не закрыли само приложение.

Этого не происходит, если ваша программа организована «обычным» образом, но если вы умышленно или случайно использовали необычное расположение, это может произойти.

Исправление, конечно, зависит от того, как именно вы расположили свой код. Тем не менее, вот предложение начать.

Обычный способ закрыть приложение - вызвать wxApp :: OnExit (), что обычно происходит при закрытии окна верхнего уровня.

У вас есть собственный класс, производный от wxApp? У вас есть переопределение OnExit ()? Если нет, то сделайте это и используйте отладчик, чтобы проверить, вызывается он или нет. Если он не вызывается, выясните, как его вызвать.

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

bool wxApp :: GetExitOnFrameDelete () const

Возвращает true, если приложение будет закрыто, когда окно верхнего уровня удалено, в противном случае - false.

Если это возвращает false, используйте соответствующий набор, чтобы сделать это так.

Третья идея: приложение не закроется, пока открыты окна верхнего уровня. Так, возможно, у вас есть другое окно верхнего уровня, которое свернуто или невидимо, но не было закрыто? Любое wxDialog или WxFrame или окно, полученное из них, является окном верхнего уровня и будет препятствовать закрытию приложения.

Четвертая идея: есть ли у вас глобальные переменные или атрибуты объекта приложения, чьи деструкторы могут войти в бесконечный цикл? Эти деструкторы вызываются после разрушения окон, и если одно из них не возвращается, вы увидите поведение, которое вы описали.

...