1

我正在我的一个项目中实现一棵树。每个节点都包含一个向量,其中包含零个或多个子节点。每个节点还包含对其父节点的引用(根的父节点引用为 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 回答