Утечки памяти в коде при использовании Embarcadero 10.3.1

Мой код C++ написан на Embarcadero 10.3.1. Я сталкиваюсь с большим количеством утечек памяти и утечек ресурсов. Я не могу определить утечки.

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

Мое приложение является фоновым заданием, которое постоянно обрабатывает файлы и создает метки. Он отлично работает пару часов и генерирует около 3000 ярлыков, а затем переходит в состояние зависания/не отвечает.

Может ли кто-нибудь предложить какое-либо решение?


person Dhatri    schedule 08.08.2019    source источник
comment
Ваше приложение статически связано с RTL? Может попробовать динамическую ссылку?   -  person Totte Karlsson    schedule 08.08.2019
comment
1. без MCVE или, по крайней мере, какого-либо соответствующего кода, о котором мы можем только догадываться ... 2. CodeGuard непригоден для больших проектов, поскольку он очень требователен к памяти и процессору, а для больших проектов то, что занимает секунды в обычном выполнении, может занять минуты или даже привести к сбою с CodeGuard но если вы сократите ненужные вещи до управляемого размера кода, тогда CodeGuard будет супер. 3. фон подразумевает многопоточность? 4. добавьте отпечатки/журналы wdebug в свое приложение, чтобы вы могли видеть, какое было последнее известное состояние перед зависанием... или какие части кода все еще работают нормально...   -  person Spektre    schedule 08.08.2019
comment
Также взгляните на это: отследить указатель в коде С++ gdb, который я создал для устранения утечек памяти в большом проекте, ведущем к обнаружению и обходу ошибки компилятора BCC ...   -  person Spektre    schedule 08.08.2019
comment
Приложение для печати этикеток действительно большое? Небольшие проекты около 10-100 тыс. LOC для меня не имеют проблем с CodeGuard (однако CG проблем не имеет. не работает с CLang). Можете ли вы разбить свое приложение на более мелкие части, чтобы протестировать его отдельно?   -  person serge    schedule 09.08.2019
comment
Как вы поняли, что в процессе есть утечки? Через диспетчер задач? Если бы у него были утечки и, наконец, не было памяти для выделения, процесс скорее бы рухнул, но вместо этого перестал отвечать ... Кстати, пробовал Deleaker? Последние версии поддерживают C++ Builder.   -  person Artem Razin    schedule 09.08.2019


Ответы (1)


Утечки памяти бывает трудно отследить. В вашем случае я подозреваю, что вы используете принтер этикеток с собственной библиотекой или драйвером, и утечки могут быть где угодно.

Во-первых, вы должны попытаться понять, какие модели управления памятью существуют в приложении. Как правило, в коде C++ Builder вы будете нести ответственность за выделение и освобождение памяти. Таким образом, каждый объект, который вы создаете с помощью new, должен иметь соответствующий delete — убедитесь, что вы понимаете, какая часть кода отвечает за освобождение объекта. (В версии 10.3.1 C++ Builder поддерживает C++ auto_ptr, но вы можете не использовать его, и вы не можете гарантировать, что любой библиотечный код, на который вы ссылаетесь, будет соблюдать семантику auto_ptr).

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

Попробуйте запустить меньший тираж и посмотрите, можете ли вы использовать CodeGuard и подобрать все, что он предлагает.

Если ваша система находится в производстве, вы захотите, чтобы она работала. Один из вариантов — запустить его как запланированную задачу Windows. Он обработает заданное количество файлов и завершит работу. ОС освободит ресурсы, которые она использовала (но не те, которые утекли на системном уровне, возможно, из-за ошибочного драйвера). Это может позволить вам поддерживать его в рабочем состоянии весь день, пока вы продолжаете находить утечки.

Удачи!

person Rob Lambden    schedule 08.08.2019
comment
В версии 10.3.1 C++ Builder поддерживает C++ auto_ptr, а для C++11 и более поздних версий он также поддерживает unique_ptr и shared_ptr. - person Remy Lebeau; 08.08.2019