1

プロジェクトの 1 つでツリーを実装しています。各ノードには、0 個以上の子ノードを持つベクトルが含まれています。各ノードには、その親への参照も含まれています (ルートの親参照は nullptr です)。クラス定義の例を次に示します。

ref class TreeNode {
    ...

    TreeNode^ _parentNode;
    Platform::Collections::Vector<TreeNode^>^ _childNodes;
}

まず、これによりメモリリークが発生しますか? これらは両方向の強い参照であると想定しているため、オブジェクトの参照カウントはゼロを超えたままになります。

Platform::WeakReference の例を見たことはありますが、インスタンス変数として見たことはありません。これは可能ですか?構文はどのようになりますか?

4

1 に答える 1

1

はい、書かれたコードは参照カウント サイクルになり、ツリーはリークします。

Platform::WeakReferenceはインスタンス変数にすることができますが、これは C++ のみの型であるため、 のパブリック サーフェスに置くことはできませんTreeNode。弱参照にアクセスしたいときはいつでも、弱参照を呼び出し.Resolve<TreeNode>()て強参照を作成する必要があります。弱参照にプロパティを使用することを検討してください。

ref class TreeNode sealed {
public:
    property TreeNode^ Parent {
        TreeNode^ get(){
            return _parentNode.Resolve<TreeNode>();
        }

        void set(TreeNode^ tn) {
            _parentNode = tn;
        }
    };

private:
    Platform::WeakReference _parentNode;
    Platform::Collections::Vector<TreeNode^>^ _childNodes;
};
于 2012-10-25T20:59:32.940 に答える