0

独自のスマート ポインターを実装しましたが、実装に致命的な欠陥があることに気付くまで、すべてが正常に機能していました。問題は、オブジェクトがそれ自体への参照を潜在的に保持するスマート ポインターを持つことができるという事実でした。これが1つのレイヤーの問題である場合、問題は簡単に回避できます-簡単に発生する可能性があるのは、参照カウントされたクラスが間接的に(そのメンバーの1つを介して)それ自体への参照を保持することです。これは、オブジェクトが決して削除されないことを意味します。これを解決できる方法/方法はありますか?

最も簡単な例:

class Derived : public Object {
public:
    static ref<Object> Create() { return ref<Object>(new Derived()); }

private:
    Derived() : m_ref(this) // m_ref now holds a reference to Derived instance
    {
        // SOME CODE HERE
    }
    ref<Object> m_ref;
};

オブジェクトは参照カウンターを含む基本クラスであり、ref は割り当てられたオブジェクトへの参照を保持するスマート ポインターです。

4

1 に答える 1

1

この問題を処理する簡単な方法はありません。これは参照カウントの根本的な問題です。

なぜそうなのかを直感的に理解するために、スマート ポインターのサイクルを検出する難しさは、サイクルを処理する難しさと同じであることに注意してください。サイクルを検出するには、「ルート ポインター」からポインターをトラバースできる必要があります。それができれば、トラバーサル中に見たものに印を付けることができます。それらにマークを付けることができれば、ガベージ コレクションであるマーク アンド スイープを実装できます。

于 2021-10-06T21:47:58.823 に答える