如何为现有共享指针设置删除器?

时间:2016-11-07 18:43:48

标签: c++ c++11 destructor shared-ptr

我需要为共享指针实例编写自己的析构函数。不幸的是,这样的实例是从库函数调用中获取的,而不是我初始化它。那么我怎样才能设置"这里的析构函数?

理想情况下,我脑海中的代码可能看起来像

pointer.setDeleter(myDeleter);

pointer = std::make_shared<MyType>(pointerOld.get(), myDeleter);

我没有找到第一个假设的API。对于第二个,据说MyType没有具有2个参数的构造函数。它不可编辑。

对此有何想法?

谢谢!

1 个答案:

答案 0 :(得分:1)

这是我能得到的最接近的。

template<class T>
std::shared_ptr<T> extra_deleter( std::shared_ptr<T> in, std::function<void(T*)> action ) {
  if (!in) return {};
  if (!action) return std::move(in);
  // action=std::move(action) in c++14
  auto new_deleter = [action](std::shared_ptr<T>* tin) { 
      action(tin->get());
      delete tin;
    };

  auto tmp = std::shared_ptr<std::shared_ptr<T>>(
    new shared_ptr<T>(std::move(in)),
    std::move(new_deleter)
  );
  if (!tmp) return {};
  // aliasing ctor:
  return {tmp, tmp.get()->get()};
}

这会创建一个共享指针共享指针,使用自定义删除操作对其进行扩充,然后使用别名ctor创建一个指向T的共享指针。

shared_ptr被销毁时,这不会导致额外的代码运行。相反,它会创建一个新的shared_ptr,其中包含额外的破坏代码。当shared_ptr的新血统死亡时,action就会运行。

如果剩余的原始shared_ptr状态没有其他引用,则shared_ptr的原始驱逐舰会运行。