4

QTでrawポインターをshared_ptrに置き換えると、コードが機能しなくなることに気付きました。たとえば、代わりに

 QTreeWidgetItem* vItem(new QTreeWidgetItem(ItemTitle));

私が使う

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

次に、プログラムがクラッシュするか、何も実行されません(.get()関数を使用して、後でコードの共有ポインターから生のポインターを取得した場合でも)。誰かが原因が何であるか知っていますか?

4

1 に答える 1

11

Qtモデルアイテムで共有ポインターを使用すると、所有権の競合が発生します。渡されたQTreeWidgetすべての所有権を取得します。また、そのアイテムを所有しています。どちらも、自分でアイテムを削除でき、他の誰もそのアイテムを後ろから削除しないことを前提としています。QTreeWidgetItemstd::shared_ptr

Qtがポインタの所有権を取得するような状況(他の例:親が子の所有権を取得する)では、 /を同時にQObject使用することはできません。その特定のオブジェクトへのポインタを保持するためだけに使用する場合にのみうまく機能します。std::shared_ptrQSharedPointerstd::shared_ptrstd::shared_ptrstd::weak_ptr

于 2012-12-14T10:43:29.623 に答える