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

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

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

理想情况下,我心目中的代码可能是这样的

pointer.setDeleter(myDeleter);

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

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

有什么想法吗?

谢谢!

最佳答案

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

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()};
}

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

source shared_ptr 被销毁时,这不会导致运行额外的代码。相反,它会创建一个新的 shared_ptr,其中包含额外的破坏代码。当 shared_ptr 的新沿袭结束时,运行 action

如果没有其他对原始 shared_ptr 状态的引用,则 shared_ptr 的原始破坏者运行。

关于c++ - 如何为现有共享指针设置删除器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40472320/

相关文章:

C++字符串解析思路

c++ - 在 C++ 中为动态分配的数组使用智能指针

c++ - 在赋值中使用 initializer_list 是最佳实践吗

c++ - 伪析构函数调用不会破坏对象

c++ - 指向 "raw"资源的指针应该在析构函数中归零吗?

c++ - 为什么在 lambda 中通过引用捕获的值被破坏了?

C++ 缓存友好方式访问 `vector <struct_type>` 的所有元素的所有成员

c++ - 如何在不授予私有(private)成员访问权限的情况下在 C++ 中隐藏 STL 仿函数结构

c# - 什么时候在 WCF 服务中调用析构函数

c++ - 连接qt和matlab时出错