Управление памятью QT4 - PullRequest
5 голосов
/ 04 февраля 2010

Я родом из довольно сильного C-фона, и у меня достаточно прочная основа в C ++. Совсем недавно я работал с C # и другими языками высокого уровня. Проект, над которым я сейчас работаю, может действительно выиграть от использования QT4, но у меня есть несколько вопросов по управлению памятью, которые я не могу понять. Я прочитал документацию по QT4, и она мне не сильно помогла. Вот почему я здесь.

1) Хорошо, для начала я понимаю, что самый простой способ использовать объекты QT4 - это объявить их локально:

void MyFunc()
{
     QString foo;
     // do stuff to foo

}

Это достаточно просто, я могу взять этот объект, передать его и знать, что, когда он выйдет из области видимости, он будет уничтожен. Но вот мой вопрос.

1) Если я создам QList и добавлю в него объекты, а затем QList выйдет из области видимости, попытается ли он освободить дочерние объекты?

2) Если подпрограмма QT4 возвращает указатель на объект, отвечаю ли я за отмену выделения этого объекта?

3) Если я создаю подкласс QWidget и добавляю его в QWindow, как мне обеспечить, чтобы при уничтожении QWindow мой виджет забирался с ним?

Спасибо за помощь.

Ответы [ 3 ]

13 голосов
/ 04 февраля 2010

Если я создаю QList и добавляю в него объекты, а затем QList выходит из области видимости, попытается ли он освободить дочерние объекты?

QList похож на std :: list. Он уничтожит содержащиеся объекты, когда он будет уничтожен.

Если подпрограмма Qt4 возвращает указатель на объект, отвечаю ли я за отмену выделения этого объекта?

Обычно нет, документы должны указывать, что происходит. Исключением являются функции take * (например, QTableWidget :: takeItem).

Если я создаю подкласс QWidget и добавляю его в QWindow, как я могу обеспечить, чтобы при уничтожении QWindow мой виджет брал с собой?

Это зависит от того, как вы создаете объект подкласса.

  • Вы можете добавить его как член виджета окна (кстати, QWindow нет), и он будет уничтожен, как любая переменная-член.
  • Вы можете выделить его новым и передать его как родительское окно, и оно будет удалено благодаря реализации дерева объектов Qt (как уже упоминалось)
  • Вы можете самостоятельно управлять памятью.

Когда QWidget (или любой QObject) уничтожается, он удаляет себя из списка родительских объектов для удаления, так что вы можете удалить его самостоятельно и не беспокоиться о двойном удалении.

2 голосов
/ 04 февраля 2010

Возможно, вы захотите начать здесь: Деревья объектов , поскольку это объясняет отношения между родителями и потомками, которые использует Qt (и все остальные ссылки, приведенные на данный момент, устарели или сторонние).

1) Если я создаю QList и добавляю в него объекты, а затем QList выходит из области видимости, попытается ли он освободить дочерние объекты?

Да, он ведет себя так же, как std :: list. Так же, как std :: list, он будет только освобождать, а не удалять. Вот где некоторые классы указателей Qt пригодятся

2) Если подпрограмма QT4 возвращает указатель на объект, отвечаю ли я за отмену выделения этого объекта?

Как сказал рпг, обычно нет, но если вы документация, так и скажут.

3) Если я создаю подкласс QWidget и добавляю его в QWindow, как я могу обеспечить, чтобы при уничтожении QWindow он брал с собой мой виджет?

Когда вы создаете свой подкласс, обязательно используйте родительский параметр в ctor. Таким образом, объект будет удален Qt. При необходимости вы можете установить родительский элемент после с помощью QObject :: setParent (QObject * parent) .

1 голос
/ 04 февраля 2010

Ответ - это отношение объекта Parent / Child, которое существует в Qt. Когда родительский объект выходит из области видимости или уничтожается любым другим способом, Qt гарантирует, что все его дочерние объекты будут уничтожены до.

Подробнее об этом поведении можно узнать здесь -> http://doc.trolltech.com/4.4/objecttrees.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...