Я привык использовать valgrind для отладки моего C-кода, но недавно переключился на Qt Creator и C++. Qt Creator имеет встроенный valgrind, который звучит хорошо, но...
если я не malloc/свободная память напрямую (т.е. использовать C++, встроенную в очистку памяти, больше не ссылаясь на объекты), не должны ли утечки памяти быть невозможными?
Как я могу вызвать утечку памяти, если C++ управляет объектами и памятью....
(Я боюсь ответа RTFM, но царапает голову)
Что-то вроде этого:
m_logFile = new QFile(programSettings->logging_filename());
должен ли я освобождать то, на что указывает этот указатель, или когда m_logFile больше не указывает на действительный объект, освободит ли память? (Так как я использую "новый" здесь, мне интересно, работает ли он по-другому)
Управление памятью Qt доступно только для иерархии QObject
, где родитель владеет QObject
. Пока вы уничтожаете родителя, все дети будут удалены. Это, конечно, относится к QWidgets
, так как они QObject
s. Технически вы можете сделать только QObject
родителем QWidget
, но он нарушает предположения, что виджеты имеют о своих родителях, поэтому не делайте этого. QWidget
может, конечно, иметь QObject
s.
Здесь очень важная деталь: это разрушение родителя, которое разрушает и удаляет детей. Родитель может быть автоматической переменной, а затем память автоматически освобождается после выхода из области. Если родительский объект размещен в свободном хранилище с использованием new
, у вас есть утечка памяти, если только:
delete
родителя. Вообще говоря, следует избегать использования голых указателей в C++. Qt предоставляет QSharedPointer
который в основном эквивалентен C++ 11 std::shared_ptr
и QScopedPointer
которые в основном эквивалентны C++ 11 std::unique_ptr
. Используйте их, если у вас нет измерений, показывающих, что ручное управление памятью поможет вам что-то с точки зрения производительности или издержек памяти. Эти интеллектуальные указатели выполняют безопасное для вас управление памятью.
Я думаю, вам будет полезно прочитать Strostrup "Язык программирования C++", 4-е издание. Он вводит эти концепции с большей глубиной.
Да, в этом случае valgrind по-прежнему полезна. C++ (даже с Qt) по-прежнему не является сборником мусора, поэтому вы можете случайно удалить утечку памяти. В примере кода, который вы дали, QFile будет протекать, поскольку ничто не уничтожит его (с помощью оператора delete).
Qt предоставляет метод, помогающий очистить любые производные классы QObject. Однако вам все равно необходимо передать правильный объект в качестве родительского объекта для очистки.
Кроме того, valgrind также поможет идентифицировать любые неправильные использования неинициализированной или освобожденной памяти.