我正在我的一个项目中实现一棵树。每个节点都包含一个包含零个或多个子节点的向量。每个节点还包含对其父节点的引用(根节点的父引用为nullptr)。以下是类定义的示例:
ref class TreeNode {
...
TreeNode^ _parentNode;
Platform::Collections::Vector<TreeNode^>^ _childNodes;
}
首先,这会导致内存泄漏吗?我假设这两个方向都是强引用,因此对象的引用计数将保持在零以上。
我见过Platform :: WeakReference的例子,但从未作为实例变量。这可能吗?语法是什么样的?
答案 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;
};