Утечки памяти в коде при использовании Embarcadero 10.3.1
Мой код на C++ написан на Embarcadero 10.3.1. Я сталкиваюсь с множеством утечек памяти и утечек ресурсов. Я не могу определить утечки.
Когда я использую CodeGaurd, приложение зависает, поэтому я не могу сделать какие-либо выводы.
Мое приложение - это фоновая работа, которая непрерывно обрабатывает файлы и создает ярлыки. Он отлично работает в течение пары часов и генерирует около 3000 ярлыков, а затем переходит в состояние зависания / отсутствия ответа.
Кто-нибудь может предложить какое-либо решение?
1 ответ
Утечки памяти могут быть трудно отследить. В вашем случае я подозреваю, что вы используете принтер этикеток с его собственной библиотекой или драйвером, и утечки могут быть где угодно.
Во-первых, вы должны попытаться понять, какие модели управления памятью существуют в приложении. С кодом C++ Builder, как правило, вы будете нести ответственность за выделение и освобождение памяти. Таким образом, каждый объект, который вы создаете с new
должен иметь соответствующий delete
- убедитесь, что вы понимаете, какая часть кода отвечает за освобождение объекта. (В 10.3.1 C++ Builder поддерживает C++ auto_ptr
но вы, возможно, не используете это, и вы не можете гарантировать, что любой код библиотеки, на который вы ссылаетесь, будет соблюдать auto_ptr
семантика).
Если вы передаете информацию в код, использующий другую модель управления памятью (например, использование COM-объекта является хорошим примером), убедитесь, что вы понимаете последствия для управления памятью. Если вы передадите ему указатель, ожидает ли он его освобождения или ожидает, что вы освободите его - и если это вы, как вы узнаете, когда он закончил с этим.
Попробуйте запустить меньший прогон и посмотрите, сможете ли вы при использовании меньшего прогона использовать CodeGuard и выбрать все, что он предложит.
Если ваша система работает, вы хотите, чтобы она работала. Одним из вариантов будет запускать его как запланированную задачу Windows. Он обработает заданное количество файлов и завершит работу. O/S освободит ресурсы, которые он использовал (но не те, которые просочились на системный уровень, возможно, с ошибочным драйвером). Это может позволить вам поддерживать работу в течение всего дня, пока вы продолжаете обнаруживать любые утечки.
Удачи!