解決方法がわからない問題が発生しました..
汎用オブジェクト プールがあります。オブジェクトが要求されると、プールはQSharedPointer
、カスタム Deleter が指定された状態で、最初に使用可能なインスタンスに戻ります。QSharedPointer
インスタンスの参照カウントが 0の場合、デリータはオブジェクトをプールに返すだけです。プレーンなオブジェクトの場合はすべて正常に機能します。QObject
Qt 5 でコンパイルすると、後継者に対しても正常に動作します。
ただし、Qt 4.6 でコンパイルすると、問題が発生します。同じオブジェクトが 2 回目に要求されると、アプリケーションはエラーで終了します。
「QSharedPointer: ポインター xxx には既に参照カウントがあります」
簡単なテストを書きました:
QObject* obj = new QObject();
QSharedPointer<QObject> p(obj, deleter); // deleter here does nothing
p.clear();
QSharedPointer<QObject> p2(obj, deleter); // this crashes the app
Qt 4.6でコンパイルすると、これは確かに失敗します。繰り返しますが、QT 5.x では正常に動作します。
Qt ソース コードを調べるとQObject
、これがパラメーターQObject
として使用されると、 4.6 が内部参照カウンターを初期化することが明らかになりました。QSharedPointer
これは、2 つのスマート ポインターが同じオブジェクトを指すことがないようにし、デストラクタでのみリセットされるようにするために行われます。
QObject
インスタンスがスマート ポインターにラップされている場合、Qt5 は参照カウンターの値をチェックしないため、機能します。
古い Qt バージョンの回避策を知っている人はいますか? refカウンターを含む内部Qtステータスを完全にリセットする方法はありますか? どんなヒントでも大歓迎です。