Qt Creator / C ++ имеет смысл в этом случае использовать valgrind

0

Я привык использовать valgrind для отладки моего C-кода, но недавно переключился на Qt Creator и C++. Qt Creator имеет встроенный valgrind, который звучит хорошо, но...

если я не malloc/свободная память напрямую (т.е. использовать C++, встроенную в очистку памяти, больше не ссылаясь на объекты), не должны ли утечки памяти быть невозможными?

Как я могу вызвать утечку памяти, если C++ управляет объектами и памятью....

(Я боюсь ответа RTFM, но царапает голову)


Что-то вроде этого:

m_logFile = new QFile(programSettings->logging_filename());

должен ли я освобождать то, на что указывает этот указатель, или когда m_logFile больше не указывает на действительный объект, освободит ли память? (Так как я использую "новый" здесь, мне интересно, работает ли он по-другому)

Теги:
memory-leaks
memory-management

2 ответа

1
Лучший ответ

Управление памятью Qt доступно только для иерархии QObject, где родитель владеет QObject. Пока вы уничтожаете родителя, все дети будут удалены. Это, конечно, относится к QWidgets, так как они QObject s. Технически вы можете сделать только QObject родителем QWidget, но он нарушает предположения, что виджеты имеют о своих родителях, поэтому не делайте этого. QWidget может, конечно, иметь QObject s.

Здесь очень важная деталь: это разрушение родителя, которое разрушает и удаляет детей. Родитель может быть автоматической переменной, а затем память автоматически освобождается после выхода из области. Если родительский объект размещен в свободном хранилище с использованием new, у вас есть утечка памяти, если только:

  1. Вы вручную delete родителя.
  2. Вы используете интеллектуальный указатель.

Вообще говоря, следует избегать использования голых указателей в C++. Qt предоставляет QSharedPointer который в основном эквивалентен C++ 11 std::shared_ptr и QScopedPointer которые в основном эквивалентны C++ 11 std::unique_ptr. Используйте их, если у вас нет измерений, показывающих, что ручное управление памятью поможет вам что-то с точки зрения производительности или издержек памяти. Эти интеллектуальные указатели выполняют безопасное для вас управление памятью.

Я думаю, вам будет полезно прочитать Strostrup "Язык программирования C++", 4-е издание. Он вводит эти концепции с большей глубиной.

1

Да, в этом случае valgrind по-прежнему полезна. C++ (даже с Qt) по-прежнему не является сборником мусора, поэтому вы можете случайно удалить утечку памяти. В примере кода, который вы дали, QFile будет протекать, поскольку ничто не уничтожит его (с помощью оператора delete).

Qt предоставляет метод, помогающий очистить любые производные классы QObject. Однако вам все равно необходимо передать правильный объект в качестве родительского объекта для очистки.

Кроме того, valgrind также поможет идентифицировать любые неправильные использования неинициализированной или освобожденной памяти.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню