【问题标题】:Can I use weak references as instance variables in Windows RT/8?我可以在 Windows RT/8 中使用弱引用作为实例变量吗?
【发布时间】:2012-10-25 08:28:02
【问题描述】:

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

ref class TreeNode {
    ...

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

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

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

【问题讨论】:

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


    【解决方案1】:

    是的,您编写的代码会导致引用计数循环,并且您的树会泄漏。

    Platform::WeakReference 可以是实例变量,但由于它是纯 C++ 类型,它不能出现在 TreeNode 的公共表面上。每当你想访问弱引用时,你应该在弱引用上调用.Resolve&lt;TreeNode&gt;() 来创建一个强引用。您可以考虑使用属性作为弱引用:

    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;
    };
    

    【讨论】:

    • 看准了!谢谢你的例子。
    • 哦,对您的代码进行快速更正。解析 WeakReference 时,您无需在模板中指定 ^。第五行应为return _parentNode.Resolve&lt;TreeNode&gt;();
    • 啊 - 好点。我更新了代码示例以移除这些帽子。这就是我编写代码而不尝试编译它所得到的...... :)
    • 从那以后我了解到 Platform::WeakReference 也覆盖了 = (equals) 运算符。不用设置_parentNode = Platform::WeakReference(tn);,你可以写_parentNode = tn;
    猜你喜欢
    • 1970-01-01
    • 2021-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-14
    • 1970-01-01
    • 2011-04-18
    相关资源
    最近更新 更多