【问题标题】:Why doesn't weak_ptr have a comparison operator==?为什么weak_ptr 没有比较运算符==?
【发布时间】:2018-09-23 06:24:11
【问题描述】:

如果我有vector<weak_ptr<Type>>,我不能使用vector::erase(remove()) 删除所需的weak_ptr,因为它没有比较运算符==。

必须将 lambda 谓词传递给 vector::erase(remove_if()) 中的 remove_if,比较通过 weak_ptr::_Get() 访问的底层原始指针

_Get() 以一个下划线和一个大写字母开头,这意味着它是为实现而保留的,不打算由用户访问。

很明显weak_ptrs 不应该以这种方式存储,但为什么呢?


我正在考虑使用vector<weak_ptr<>>weak_ptrs 保存在一个子类中lock()ing,它们尚未在管理类中删除(在多线程应用程序中)。

管理器提醒子类创建和删除对象,保持vector<weak_ptr<>> 是最新的。

【问题讨论】:

  • 您希望== 进行比较?相同的weak_ptr?还是对同一个对象有不同的weak_ptrs?或者不同的weak_ptrs 对具有相同值的不同对象?
  • 你的谓词可以做a.lock() == b.lock(),而不依赖于内部实现细节。
  • @GemTaylor 所有过期的句柄都是相同的。没有(标准的、便携的)方法可以区分它们;他们不跟踪他们的出处。如果你认为你需要它,那么你需要在 weak_ptr 实例旁边保留它的某种形式。

标签: c++ c++11 smart-pointers comparison-operators weak-ptr


【解决方案1】:

您可以使用带有显式谓词的擦除删除习语。

例如:

#include <functional>
#include <iostream>
#include <memory>
#include <vector>

using std::cout;
using std::make_shared;
using std::remove_if;
using std::vector;
using std::weak_ptr;

int main()
{
  auto p7 = make_shared<int>(7);
  auto p8 = make_shared<int>(8);
  auto p10 = make_shared<int>(10);
  auto p11 = make_shared<int>(11);

  vector<weak_ptr<int>> v;

  v.push_back(p7);
  v.push_back(p8);

  {
    auto p9 = make_shared<int>(9);
    v.push_back(p9);
    // p9 dtor'd here
  }

  v.push_back(p10);
  v.push_back(p11);
  p8.reset(new int{18}); // old p8 dtor'd here
  p10 = make_shared<int>(110); // old p10 dtor'd here

  // Only 7 and 11 left.

  v.erase(remove_if(v.begin(), v.end(), [](auto w){ if (auto spt = w.lock()) return false; else return true; }), v.end() );
  for (auto w : v)
  {
    cout << "Value is ";
    if (auto s = w.lock())
    {
      cout << *s << "\n";
    }
    else
    {
      cout << "MISSING!\n";
    }
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-03
    • 1970-01-01
    • 2020-06-23
    • 2018-05-27
    • 1970-01-01
    • 2015-03-14
    • 2012-10-19
    相关资源
    最近更新 更多