Проблема удаления дочерних объектов QSA - PullRequest
0 голосов
/ 25 апреля 2011

У меня есть некоторые проблемы с удалением указанных объектов QSA. В конструкторе я написал:

  QSProject * project = {initialization of QSProject}
  MyWrapper * wrapper = new MyWrapper; // MyWrapper is QObject's child. It comes without parent here
  project->addObject(wrapper);

Я написал в дескрипторе:

  project->clearObjects();
  delete project;
  delete wrapper;

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

Я провел небольшое исследование и знаю, что:

  1. QSProject не удаляет свои «дочерние объекты», так что это не проблема «двойного удаления»
  2. Если я не добавляю упаковщик в QSProject в конструкторе, он работает хорошо.
  3. Если я не удаляю оболочку в дескрипторе, она работает хорошо (но утечки памяти).

Что случилось?

1 Ответ

0 голосов
/ 25 апреля 2011

Во-первых, я не знаком с QSA, но, учитывая, как обычно работает Qt API, QSProject, скорее всего, станет владельцем объекта.Это означает, что QSProject перезаписывает объект с помощью QObject :: setParent () .

В этом случае вы вдвойне удаляете объект.

Подтвердили ли вы с помощью такого инструмента, как valgrind, что вы фактически теряете память, когда опускаете удаление?

...