6

ポインターの所有権を取得するポインター コンテナーが必要です。つまり、要素が削除されるか、コンテナーがスコープ外になると、のようにすべてのポインターが解放されboost::ptr_vectorます。

QList<QScopedPointer<AbstractClass> >動作しません (コンパイル エラー、コピー コンストラクターがありませんか?)。

現在、私は を使用してQList<QSharedPointer<AbstractClass> >いますが、参照カウントとマルチスレッド用の高価なミューテックスを備えているため、やり過ぎのように感じます。

編集: Qt3では非常に同等でしたが、後のバージョンから削除されたQPtrList (@ForEveRに感謝)について知りました。なぜ彼らがそれを削除するのか理解できません。

4

2 に答える 2

4

上記の理由により、 QSharedPointer が少しオーバーヘッドであることは間違いありません。

残念ながら、Qt にはそのようなポインター ベクトルはありません。また、言語が進化し、同様の作業を行うための適切なプリミティブが用意されたときに、追加する価値があるかどうかについても少し疑問があります。

Qt コア開発者の 1 人と簡単に話し合ったところ、今日の推奨ソリューションは QSharedPointer または C++11 の次のようです。

std::vector<std::unique_ptr<AbstractClass>>

QVector はコピーを実行する可能性があるため、std::vector の代わりに QVector を使用しないでください。

C++ 11 であっても、このソリューションで試行しないでください。

QList<QScopedPointer<AbstractClass>>

ここでの問題は、QList がコピーを実行したいということです。const 以外のメソッドを使用すると、 detach が呼び出されてコピーが作成され、コンパイラは実行されません。

また、QScopedPointer にはムーブ コンストラクターまたはオペレーターがなく、これは仕様によるものです

于 2014-12-17T10:43:00.353 に答える
0

Qt の概念に基づくもう 1 つのアイデア:

リスト内のポインターが示すオブジェクトを QObject から派生させ、リストの所有権を保持する小さな QObect ベースのクラスを追加できます。この新しい QObject ベースのリストに追加される各ポインターは、所有するリストクラスをその親として設定する必要があります。現在、QObject ベースのリスト コンテナは、リリース時に Qt メカニズムを使用してクリーンアップを処理します。

class Ptr : public QObject {
};

class MyList : public QObject {
    QList<Ptr> m_myList;

public:
    void add( Ptr *item ) {
        m_mylist.push_back( item );
        item->setParent( this );
    }
};

Qt のオブジェクト ツリーの所有権の詳細については、http: //qt-project.org/doc/qt-4.8/objecttrees.htmlを参照してください。

もちろん、これは std::unique_ptr のような小さな C++-11 型を使用するよりもはるかにオーバーヘッドです。

于 2014-12-17T10:53:23.110 に答える