gpt4 book ai didi

c++ - 是否可以在标准弱指针之上实现非拥有 "slightly smart"指针?

转载 作者:太空狗 更新时间:2023-10-29 19:45:14 25 4
gpt4 key购买 nike

我一直在想,虽然我明白了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_ptr 将具有 observer_ptr 的基本语义,知道 A 是否已被删除。但这种方法存在问题:weak_ptr 必须被锁定,将它们变成 shared_ptr 以供使用,感觉不整洁,但更严重的是 A 的 shared_ptr 必须存在于某处,当用户想要的只是一个不拥有的稍微智能的指针时任何内容。用户同意在适当的时候手动销毁内容:没有共享所有权,因此用户在这种情况下创建 shared_ptr 是一种代码味道。

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

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

最佳答案

这种智能指针的问题在于它比std::unique_ptrT*std::weak_ptr 更容易出错>.

当您想知道指针是否已被其唯一所有者从别处删除时,实际上您需要共享所有权和 std::weak_ptr

你看,在使用弱指针之前需要“锁定”它是有原因的。这是因为当你开始使用它时,你就获得了指针的所有权。如果你不能锁定你的“知道是否被删除的观察者指针”,你就不能安全地使用它,因为在验证它的有效性之后,它随时可以被删除。


还有,你还有更深层次的矛盾。

当你有一个唯一的指针时,你就知道谁要删除它,你就知道谁是所有者。

如果您有一个程序在运行时检查指针的有效性,那是因为您的程序不知道资源所有权的状态。

如果您的程序或程序的一部分无法知道资源的所有权状态并且需要检查它是否已被删除,那么您需要确保它不会在下一行使用时被删除它,因为它可以随时删除,因为您无法知道它的所有权状态。因此,您需要在使用资源时暂时拥有该资源。因此,您需要共享所有权以在执行代码时推迟所有权决定。

如果您拥有共享所有权,则不需要知道是否已删除的观察者指针

那时您的指针不需要存在。


所以...您认为您需要那个指针,它可能很方便...您能做什么?

您需要检查您的代码。如果只有一个所有权,为什么你需要知道指针的有效性。为什么不能简单地问问店主?

如果所有者不存在,当所有者被删除时,您想要进行检查的代码可能无效。也许您想要进行检查的结构应该与所有者同时死亡。

如果您的唯一所有者在不可预知的时刻死亡(例如,您的唯一所有者由共享所有者持有),那么您的结构可能应该检查共享所有者的有效性。

也许您调用函数的代码想要检查其指针是否仍然有效时,当所有者已死时,根本不应该调用它。

...

等等。

有很多方法可以解决这个问题,但需要一个指向唯一所有者的弱指针通常表明程序存在缺陷或程序中对象生命周期的推理存在问题。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com