Closed. This question needs details or clarity 。它目前不接受答案。












想改善这个问题吗?添加细节并通过 editing this post 澄清问题。

1年前关闭。



Improve this question




我一直在想,虽然我理解 the goals of std::observer_ptr,但我认为如果至少有一个类似的指针类型的选项,知道它指向的内容是否已被删除,那就太好了。例如,我们可以有如下内容
slightly_smart_ptr<Foo> p1(new Foo());
auto p2 = p1;
p1.erase(); // This deletes the foo referred to by p1.
if (p2.expired())
   std::cout << "p2 is expired\n"; // this will fire

使用当前标准库实现此目的的一种方法是 make a shared_ptr to A in some scope that will exist for the lifetime of A, always refer to A by passing weak_ptrs around ,并在不再需要时通过重置 shared_ptr 删除 A。这里的weak_ptrs 将具有observer_ptrs 的基本语义,它知道A 是否已被删除。但是这种方法存在问题:weak_ptrs 必须被锁定,将它们变成 shared_ptrs 来使用,这感觉不整洁,但更严重的是,shared_ptr to A 必须存在于某处,当用户想要的只是一个不拥有的稍微智能的指针时任何内容。用户同意在时机成熟时手动销毁内容:没有共享所有权,因此在这种情况下用户创建 shared_ptr 是一种代码气味。

然而,我想不出一种可以有效隐藏此实现细节的方法。

这样的指针是否作为提案或在 boost 库或其他地方存在?

最佳答案

这种智能指针的问题在于它比 std::unique_ptrT*std::weak_ptr 更容易出错。
当您想知道指针是否已被其唯一所有者从其他地方删除时,实际上您需要共享所有权和 std::weak_ptr
您看,在使用弱指针之前需要“锁定”弱指针是有原因的。这是因为当您开始使用它时,您将获得指针的所有权。如果你不能锁定你的“知道是否被删除的观察者指针”,你就不能安全地使用它,因为在验证它的有效性后的任何时候,它都可以被删除。

此外,你还有更深层次的矛盾。
当你有一个唯一的指针时,你知道谁会删除它,你知道谁是所有者。
如果您有一个程序在运行时检查指针的有效性,那是因为您的程序不知道资源的所有权状态。
如果您的程序或程序的一部分无法知道资源的所有权状态并且需要检查它是否已被删除,那么您需要确保在使用它时不会在下一行删除它,因为它可以随时删除,因为您无法知道其所有权状态。因此,您需要在使用时暂时拥有该资源。因此,您需要共享所有权以在执行代码时推迟所有权决策。
如果您拥有共享所有权,则不需要知道是否已删除的观察者指针。
那么你的指针就不需要存在了。

所以......你认为你需要那个指针,它可能很方便......你能做什么?
您需要检查您的代码。如果只有一个所有权,为什么需要知道指针的有效性。为什么你不能简单地问业主?
如果所有者不存在,那么当所有者被删除时,您想要进行检查的代码可能无效。也许您想要进行检查的结构应该与所有者同时死亡。
如果您的唯一所有者在不可预测的时刻去世(例如,您的唯一所有者由共享所有者持有),那么您的结构可能应该检查共享所有者的有效性。
也许您调用想要检查其指针是否仍然有效的函数的代码不应该在所有者死亡时调用它。
...
等等。
有很多方法可以解决这个问题,但是需要一个唯一所有者的弱指针通常表明程序中存在缺陷,或者程序中对象生命周期的推理存在问题。

关于c++ - 是否可以在标准弱指针之上实现一个非拥有的 "slightly smart"指针?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57528382/

10-11 22:40
查看更多