【问题标题】:Do I have to use weak_ptr.lock() just to test if it points to a valid object?我是否必须使用 weak_ptr.lock() 来测试它是否指向有效对象?
【发布时间】:2012-11-01 08:18:24
【问题描述】:

必须创建一个临时的 shared_ptr 只是为了查看 weak_ptr 是否指向一个有效的对象,这似乎有点低效。我什至不想访问该对象。这是因为我有一个函数从 shared_ptr 的向量返回一个weak_ptr,如果它返回一个空的weak_ptr,那么这意味着该对象不存在该GUID。

所以我只是在测试一个对象是否存在。

是否有另一种方法可以在不创建 shared_ptr 的情况下检查 weak_ptr 是否为空?

【问题讨论】:

  • 你最初是如何得到弱指针的? 那是必须改变的界面。
  • lock() 返回一个 shared_ptr 这就是我发表这篇文章的原因。
  • 以后问之前用cppreference。
  • @Mooing Duck 你是什么意思?您的评论含糊不清。
  • @Pubby 我做了,我也阅读了 MSDN。两个页面都没有提到空的测试,而是说 expired() 测试管理对象是否已被删除。这与测试从未有任何内容的weak_ptr 是不同的上下文。但是现在人们已经引起了我的注意,它起作用了。即使名称 expired() 并不能真正解释我使用它的上下文,但如果它有效,它就有效。

标签: c++ shared-ptr weak-ptr


【解决方案1】:

您可以使用expired() 成员函数。

【讨论】:

  • @Pubby:比起if(someVecor.size()==0),我更喜欢使用if(someVector.empty())。同样的原因,在这种情况下我更喜欢expired。更明确
  • 我讨厌使用 Microsoft 文档,除非它是 Microsoft 特定的功能或问题。最好是en.cppreference.com/w/cpp/memory/weak_ptr/expired
  • @MarkRansom:更改了链接
  • @Pubby,请参阅链接中的注释:“expired() 可能比 use_count() 更快。”
  • 我很确定 use_count 被记录为仅出于性能问题的调试目的 (use_count() is not necessarily efficient. Use only for debugging and testing purposes, not for production code.)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-14
相关资源
最近更新 更多