我可以在Windows RT / 8中将弱引用用作实例变量吗?

时间:2012-10-25 08:28:02

标签: windows winapi windows-8 microsoft-metro c++-cx

我正在我的一个项目中实现一棵树。每个节点都包含一个包含零个或多个子节点的向量。每个节点还包含对其父节点的引用(根节点的父引用为nullptr)。以下是类定义的示例:

ref class TreeNode {
    ...

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

首先,这会导致内存泄漏吗?我假设这两个方向都是强引用,因此对象的引用计数将保持在零以上。

我见过Platform :: WeakReference的例子,但从未作为实例变量。这可能吗?语法是什么样的?

1 个答案:

答案 0 :(得分: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;
};