Утечка памяти из лишних байтов окна? - PullRequest
0 голосов
/ 30 августа 2011

Я делаю класс окна C ++ и использую дополнительные байты для каждого созданного окна (используя cbWndExtra структуры WNDCLASSEX и т. Д.) При регистрации класса окна.Освобождает ли :: DestroyWindow (..) лишние байты выделенного окна?

Кажется, что когда я создаю и уничтожаю много оконных объектов в цикле, увеличивается «размер коммита» моего приложения в диспетчере задач.

Мой класс C ++ не выделяет никакой памяти, более того, он не имеет элементов управления / панелей инструментов / меню, он, похоже, не пропускает объекты GDI или что-то подобное, поэтому я подозреваю, что это что-то с дополнительными байтамиокно.

Кто-нибудь имеет какие-либо идеи о том, что может пойти не так?

Есть ли какой-нибудь API, который я должен вызывать для освобождения дополнительных байтов?

Есть ли что-то ещечто вы должны сделать при уничтожении окна, использующего дополнительные байты?

РЕДАКТИРОВАТЬ: я пытался создать только одно окно определенного класса, который использует дополнительные байты и уничтожить его в цикле и, опять же, зафиксироватьразмер моего приложения увеличивается.Я также ждал несколько часов, и размер коммита не уменьшался вообще.Дополнительные байты содержат только указатель на объект, который представляет окно.Этот объект уничтожается (он создается статически в цикле).В любом случае, похоже, что это не моя вина, и что это может даже не быть ошибкой Windows (как вы говорите - хотя я не уверен на 100%), поэтому я собираюсь оставить все как есть ...

Ответы [ 2 ]

5 голосов
/ 30 августа 2011

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

Кроме того, «уменьшение размера коммита» не приводит к утечке памяти. Распределители не сразу возвращают освобожденную память в ОС, они могут сохранить ее и использовать позже. Попробуйте создать простой бесконечный цикл CreateWindowEx / DestroyWindow для проверки.

0 голосов
/ 30 августа 2011

Ваша задача - освободить любую память, на которую вы ссылаетесь, установив поле cbWndExtra.Если вы подумаете об этом, это имеет смысл, поскольку Windows не знает, как вы сначала распределили память (например, malloc, new, LocalAlloc и т. Д.)не ясноЕсли вы вставите указатель в поле, а он указывает на то, что вы выделили в своем приложении, эта память не будет освобождена.Будут дополнительные байты, но не те, на которые они указывают.

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