Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 668
ISTB Avatar asked Dec 21 '22 12:12

ISTB


1 Answers

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.

like image 102
Frank Osterfeld Avatar answered Dec 23 '22 01:12

Frank Osterfeld