我有一个由 Graph 和 Node 类实现的有向无环图。每个节点都有一个指向子节点的指针列表和一个指向父节点的指针列表。我最近添加了父母,因为一些算法需要快速访问父列表并且图形很小,每个节点只有几个连接,所以没有内存问题。
Child 列表使用 std::shared_ptr 以便节点至少只要有父节点就保存在内存中。但我不希望一个节点拥有它的父母,所以我使用了weak_ptr作为指向父母的指针。
但随后算法出现了问题。算法必须从weak_ptr创建一个新的shared_ptr,所以我不能直接使用operator==,并且使用标准函数如std::find()需要编写一个名为my_weak_ptr.lock()的lambda函数,然后比较它到一些shared_ptr。
如果我切换到 shared_ptr,负责删除节点的代码中的任何小错误都可能导致内存泄漏。或者,如果我有一个指向已删除节点的指针,代码将能够访问一个不应该存在的节点,因此查找一些错误可能会变得更加困难。但是在不取消引用/删除/等方面,使用 shared_ptr 与 weak_ptr 一样安全。当不应该时,(所以它比原始 C++ 指针更好)和 std::find() 可以直接使用,因为 shared_ptr 可以被取消引用,不像weak_ptr。
这里是否有“更好”的设计,或者这是这种特定情况的问题,这取决于例如,如果我执行weak_ptr::lock() 的额外操作或冒着难以找到的错误的风险,这有多重要?