【问题标题】:Null checking from multiple sources: shared_ptr vs double pointer?来自多个来源的空值检查:shared_ptr 与双指针?
【发布时间】:2017-09-23 09:30:37
【问题描述】:

需要对多个来源的缓存指针进行空检查,如下所示:

双指针:

int *ptr = new int(10); 
int **pptr = &ptr; // from another source
ptr = nullptr;
cout << *pptr << endl; //nullptr

shared_ptr:

shared_ptr<int> sptr = make_shared<int>(10); 
weak_ptr<int> wptr = sptr; //from another source
sptr.reset();
cout << wptr.lock() << endl; //nullptr

关注点:

我并不是特别喜欢双指针语法,更不用说它可能不安全,但我一直听说 shared_ptr 非常慢,因为我并不真正需要引用计数,因为应该只有一个来源负责对象范围。托管内存是否值得损失任何性能?

最好,是否有任何替代方案?

【问题讨论】:

  • 不清楚“来自其他来源”是什么意思。您是否使用多个线程来读取和写入这些指针?
  • 对不起,我的意思是来自另一个文件,如 cpp.多线程可能在遥远的将来成为可能,但不是现在。

标签: c++ shared-ptr double-pointer


【解决方案1】:

...但我一直听说由于引用计数,shared_ptr 真的很慢...

是的,由于引用计数,存在性能开销。虽然很小。

...我真的不需要,因为只有一个来源应该负责对象范围。
...
最好,有任何替代方案吗?

如果正确和异常安全的内存管理是您唯一关心的问题,并且您只有一个所有者,您始终可以使用std::unique_ptrget() 函数:

unique_ptr<int> uptr = make_unique<int>(10); 
uptr.reset();
cout << uptr.get() << endl; //nullptr

【讨论】:

  • 这是我最初的设计,但我需要缓存指针。我的对象存在于层次结构中,每次需要检索后代时我都无法遍历整个树。每个节点都管理自己的子节点,因此删除节点需要对引用所述指针的每个文件进行空值检查。
  • @LinguistTroubadour 那么你真的有一个共享模型,而不是你在问题中写的内容。然后使用std::shared_ptr,我会忽略性能开销以支持整体内存一致性。
  • 感谢您的帮助。只是我只需要 weak_ptrs 来检查我是否可以从有效对象中取消引用。应该只有一个 shared_ptr 负责对象的范围,因此本质上它的行为就像一个 unique_ptr。我只是希望有一种方法可以解决这种特殊情况。
【解决方案2】:

首先,预优化是万恶之源,你不应该放弃编程语言中的一些最佳特性,因为你害怕轻微的性能损失!

既然我们已经解决了这个问题,我建议您尽可能使用托管对象,如果性能成为问题,请使用实际的基准测试工具来查找您的瓶颈...

关于您的实际问题,尚不清楚您在使用指针做什么,因此很难提出替代方案,但我建议您查看此link,以全面了解标准中的智能指针图书馆。

【讨论】:

  • 我想这就是我必须要做的。谢谢。
【解决方案3】:

在我看来,您的设计或我们所说的任何东西都在为第二个示例而大喊大叫。而且更安全。和那个一起去。

【讨论】:

  • 实际上,如果他在一个地方使用它而在其他地方使用它的 ptr 很弱,我们在说什么?一名裁判计数?仅此而已?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-17
  • 2020-12-09
  • 2016-11-07
  • 1970-01-01
相关资源
最近更新 更多