Как интерпретировать вывод C++Builder CodeGuard?
CodeGuard сделал это объявление:
9/12/2022 7:04:08 PM started a CodeGuard(tm) process: MyProg.exe(12200)
Resource leak in process: MyProg.exe(12200) - System.pas#4942
The memory block (0x305EBC0) was never freed
The memory block (0x0305EBC0) [size: 16 bytes] was allocated with SysGetMem
0x00F6BAAE - System.pas#4942
0x0128535B
0x012853A7
0x0128552A
я не знаю чтоSystem.pas
является. Как определить «Блок памяти (0x305EBC0)»? Где я могу найти, где был выделен массив?
1 ответ
system.pas
является частью VCL. Вы знаете, что VCL написан на PASCAL, поэтому*.pas
файлы по-прежнему компилируются в С++ Builders... Это намекает на то, что проблема связана с использованием некоторых компонентов VCL...
Ошибка показала, что при выходе вашего приложения или деструкторе какого-либо класса некоторые вещи VCL никогда не освобождались/выпускались, это может быть забыто.delete
илиdelete[]
с вашей стороны, однако, я видел это также в результате ошибки компилятора в части C++Bulder.
Если вы используете более старую версию C++Builder, как я, см. связанную информацию:
Подобные проблемы часто возникают (по моему опыту), если вы:
создавать/размещать компоненты VCL (особенно формы) самостоятельно, используя
new,delete
.иметь глобальные константы с невыровненной длиной (не кратной 4 байтам)
На мой взгляд, это не ошибка самого CodeGuard, я много раз был свидетелем того, что даже доступ к переменной времени выполнения
AnsiString
s выдавал такую ошибку в некоторых случаях, но без CodeGuard все работает нормально...иметь
name
конфликты с VCL или любой другой включенной библиотекойэто очень распространено, если вы также используете английские имена для своих вещей... VCL обычно начинается с буквы верхнего регистра, как иногда, если вы объявляете свои собственные
Draw
эти два могут быть смешаны без ошибки компилятора, вызывающей ошибку. Такой проект имеет тенденцию в одних сборках использовать правильный, а в других неправильный Draw (например, после любого незначительного изменения в исходном коде, такого как добавление пустой строки или пробела).использовали встроенные единицы вместо обычных
*.h,*.cpp
файл они компилируются по-разномуВидел это много раз, особенно в BCB6, такие проекты иногда неправильно скомпилированы без каких-либо ошибок, но код не делает то, что должен...
Поэтому не добавляйте в файлы проекта, которые должны быть обычными.
#include
d большую часть времени все работает так, как ожидалось, однако, как только проект становится больше, такой обмен, как правило, вызывает проблемы ...
Однако, если эта ошибка присутствует только при выходе из приложения, то это не имеет большого значения, поскольку ОС все равно освободит материал, поэтому реальной утечки памяти не произойдет. Избавиться от них непросто (а иногда даже невозможно)
Чтобы определить блок памяти, вы можете проверить свои визуальные компоненты в окне Watch, если вы добавите туда для примераForm1
вы увидите значение указателя в шестнадцатеричном формате. Однако, если у вас слишком много компонентов, проверка их всех будет неприятной...
Чтобы определить место, где возникла ошибка, вы должны проверить трассировку вызовов, что произошло до этого.0x00F6BAAE - System.pas#4942
поэтому нажмите на другие адреса ниже, он должен показать один обратный вызов ... пока вы не нажмете свой собственный код