gpt4 book ai didi

c++ - 使用裸指针而不是 weak_ptr 有什么好处吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:35:12 33 4
gpt4 key购买 nike

问题:是否有任何令人信服的理由对非拥有资源使用裸指针,或者我们应该使用 weak_ptr

CPP.reference

std::weak_ptr models temporary ownership: when an object needs to be accessed only if it exists, and it may be deleted at any time by someone else

但是,在 Which kind of pointer do I use when? 的接受答案中我们有声明:

Use dumb pointers (raw pointers) or references for non-owning references to resources and when you know that the resource will outlive the referencing object / scope. Prefer references and use raw pointers when you need either nullability or resettability.... If you want a non-owning reference to a resource, but you don't know if the resource will outlive the object that references it, pack the resource in a shared_ptr and use a weak_ptr.

这个答案之后有很多关于裸指针使用的来回讨论,没有真正的解决方案。我看不出有任何理由使用哑指针。我错过了什么吗?

最佳答案

weak_ptr 有一个非常特殊的目的:打破shared_ptr 循环。例如,std::enable_shared_from_this 是基于让一个对象包含对自身的 weak_ptr。如果它直接包含一个 shared_ptr 那么这将创建一个循环,所以它有一个 weak_ptr

您使用 weak_ptr,否则您将使用 shared_ptrweak_ptr 具有更高的成本,因为除了 shared_ptr 的成本之外,还有 产生 的对象存在性检查shared_ptr,或者不是。此外,它是一个更复杂的野兽,因此更容易被错误使用。

我想不出 weak_ptr 与“临时所有权”有什么关系(除了在检查存在并使用生成的 shared_ptr 之后,那是一个临时共享所有权,每次使用都会重复一次)。例如,std::enable_shared_from_this 与临时所有权无关。通常我会忽略此类声明的来源,并建议其他人忽略它,但 cppreference.com 是我们拥有的最好的免费在线 C++ 引用资料。奇怪的是它包含了一个无意义的陈述。但是,没有什么是完美的,正如我曾经在 clc++ 中对 Bjarne 所说的那样,于是他纠正了我对“完美”的拼写。嗯!嗯。


我不知道使用原始指针而不是 weak_ptr 有什么优势,其中需要 weak_ptr。原始指针不能完成 weak_ptr 保持 shared_ptr 控制 block 的工作,所以在我看来,仅仅是 idea 用原始指针替换 weak_ptr 是无稽之谈。但是,当一个人不再对学习从未想过的事情感到惊讶的那一天,就是一个人死去的那一天,所以可能存在对我来说有些晦涩难懂的此类用途。


此外,在需要原始指针的地方使用 weak_ptr 也没有任何优势。相反,weak_ptr 引入了相对而言巨大的控制 block 分配和引用计数成本。所以我想不出任何情况下用 weak_ptr 替换原始指针是有意义的,我不希望这是我学习其他方式的情况。

关于c++ - 使用裸指针而不是 weak_ptr 有什么好处吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36167004/

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