警告STL4016:std::shared_ptr::unique() 在 C++17 中已弃用,如何替换?

warning STL4016: std::shared_ptr::unique() is deprecated in C++17, how to replace it?

提问人:Rodrigo 提问时间:11/7/2023 更新时间:11/7/2023 访问量:74

问:

我有以下用法.unique()

void pixmappool::flush() {
  auto it = _pool.begin();

  while (it != _pool.end()) {
    if (it->second.unique()) {
      it = _pool.erase(it);
    } else {
      ++it;
    }
  }
}

在哪里:_poolstd::unordered_map<std::string, std::shared_ptr<pixmap>, std::hash<std::string>> _pool;

这非常有效,因为我的应用程序没有线程(我没有创建任何线程)。

是否可以将其更改为“std::weak_ptr”并具有相同的行为(当它只有一个副本时,将其删除)。_pool

到目前为止,我所读到的,我应该用来将副本放入 std::shared_ptr,然后使用 ,对吗?weak_ptr.lock()weak_ptr.use_count()

C++ STL

评论

4赞 HolyBlackCat 11/7/2023
.use_count() == 1相当于以前做的事。如果你只有一个线程,那也没关系。或使用 .这两个选项是相互排斥的。.unique()std::weak_ptr
2赞 Cubic 11/7/2023
您可以直接使用,无需(尽管那时您应该只使用)。方法的唯一区别是调用析构函数的时间;使用您的方法,只要池是最后一个剩余的所有者,而您,只要最后一个剩余的所有者释放它,它就会立即出现。实际上取决于您的用例,哪一个更可取。use_countweak_ptrlockexpiredflushweak_ptr
0赞 Pete Becker 11/8/2023
“已弃用”表示它可能会在标准的未来版本中删除。在此之前,如果确实如此,则没有理由重写工作代码。即便如此,库提供商仍将继续支持它,以便使用它的代码不会突然中断。

答: 暂无答案