9

QSharedPointer管理対象オブジェクトがその目的を終了し、すぐに削除の準備ができていることを通知する状況があります (実行後、readyForDeletionシグナルを発する関数を離れた後)。通常のポインターを操作するときQObject::deleteLaterは、オブジェクトを呼び出すだけですが、QSharedPointerマネージド インスタンスではこれができません。私の回避策は次のとおりです。

template<typename T>
class QSharedPointerContainer : public QObject
{
   QSharedPointer<T> m_pSharedObj;

public:

   QSharedPointerContainer(QSharedPointer<T> pSharedObj)
      : m_pSharedObj(pSharedObj)
   {} // ==> ctor

}; // ==> QSharedPointerContainer

template<typename T>
void deleteSharedPointerLater(QSharedPointer<T> pSharedObj)
{
   (new QSharedPointerContainer<T>(pSharedObj))->deleteLater();
} // ==> deleteSharedPointerLater

これはうまく機能しますが、この方法を使用すると多くのオーバーヘッドが生じます (新しいものを割り当てるQObjectなど)。このような状況を処理するためのより良い解決策はありますか?

4

2 に答える 2

21

QSharedPointer コンストラクターは次のように使用できますDeleter

deleter パラメータは、このオブジェクトのカスタム デリータを指定します。強い参照カウントが 0 になると、演算子 delete() の代わりにカスタムのデリータが呼び出されます。これは、たとえば、代わりに QObject で deleteLater() を呼び出す場合に便利です。

 QSharedPointer<MyObject> obj =
         QSharedPointer<MyObject>(new MyObject, &QObject::deleteLater);
于 2012-09-27T14:44:04.500 に答える