Структуры данных в Qt находятся в куче или в стеке? - PullRequest
3 голосов
/ 18 мая 2011

Мне интересно, помещает ли Qt такие вещи, как "версия 1" приведенного ниже кода в кучу?В версии 1, будет ли dirStuff помещаться в стек или кучу Qt?Я спрашиваю, потому что у меня есть ощущение, что Java помещает все структуры данных в кучу ... Не уверен, потому что я не помню, чтобы мне приходилось думать об этом с Java.

версия 1

QFileInfoList dirStuff = dir.entryInfoList(QDir::Dirs | QDir::Files | 
                         QDir::NoDotAndDotDot | QDir::System | QDir::Hidden);

версия 2

QFileInfoList * dirStuff = new QFileInfoList();
*dirStuff = dir->entryInfoList(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot |
                                       QDir::System | QDir::Hidden);

Конечно, я предполагаю, что версия 2 находится в куче, но мне интересно, если ...

delete dirStuff;

будетдействительно очистите "версию 2" от dirStuff, потому что это не обычный объект, а, вероятно, связанный список.Очистка, которая, на мой взгляд, может быть проблематичной, поэтому мне интересно, есть ли какой-то особенный способ Qt, которым я должен очищать структуру данных Qt, например QFileInfoList в куче ... или если обычное старое удаление C ++это достаточно хорошо.

Ответы [ 2 ]

3 голосов
/ 18 мая 2011

Контейнеры, такие как QList, QVector и т. Д., И структуры данных, такие как QString, QByteArray, QFileInfo ... могут быть созданы как в стеке, так и в куче с помощью new / delete. удалить всегда достаточно; Любая необходимая специальная очистка будет заключена в деструктор.

Тем не менее, все классы, которые я упомянул выше, должны быть созданы в стеке, если нет веских причин для кучи (а обычно их нет). Предполагается, что они передаются по значению / константной ссылке, а не по ссылке или указателю. Они неявно обмениваются (копирование при записи), что означает, что копии без изменений дешевы. В отличие от Java, где вы передаете почти все по ссылке, здесь объекты являются семантическими значениями. Пример:

 //getter returns copy
 QList<Something> Foo::somethings() const {
     return m_somethings;
 }

 //list is passed by const reference to the setter 
 void Foo::setSomethings( const QList<Something>& l ) {
     m_somethings = l;
 }
 ...

 //Get the value of m_somethings, creating a (yet unmodified) copy. 
 QList<Something> list = somethings();
 //modify the copy. m_somethings is _not_ modified (different object).  
 list.append( Something( "Something else" ) );
 //Write changes back to m_somethings
 setSomethings( list );

См. Также этот ответ на аналогичный вопрос, объясняющий, почему QObjects отличаются.

3 голосов
/ 18 мая 2011

В версии 1 объект будет помещен в стек, но он может внутренне указывать на данные, выделенные в куче (если он динамически выделяет память внутри своих методов).

О версии 2, delete очистит его, потому что он вызывает деструктор QFileInfoList, в котором библиотека Qt делает все необходимое, чтобы удалить все ресурсы, которые больше не будут использоваться.

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