简体   繁体   中英

Qt raw vs std::shared_ptr

I noticed that when substituting raw pointers with shared_ptr in QT, my code does not work anymore. For example, if instead of

 QTreeWidgetItem* vItem(new QTreeWidgetItem(ItemTitle));

I use

 std::shared_ptr<QTreeWidgetItem> vItem(new QTreeWidgetItem(ItemTitle));

then, either the program crashes or nothing is done (even if I use the .get() function to get the raw pointer from the shared one later in my code). Does anybody knows what could be the cause?

Using shared pointer with Qt model items causes an ownership conflict: QTreeWidget takes ownership of any QTreeWidgetItem you pass to it. std::shared_ptr also owns its item. Both assume they can delete the item themselves and that nobody else will delete it behind their back.

In such situations, where Qt takes ownership of the pointers (other example: parent QObject taking ownership of its children), one cannot use std::shared_ptr / QSharedPointer at the same time. std::shared_ptr only works well when using std::shared_ptr and std::weak_ptr exclusively to hold pointers to that particular object.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM