如何为现有共享指针设置删除器?
How to set the deleter for an existing shared pointer?
我需要为共享指针实例编写自己的析构函数。不幸的是,这样的实例是从库函数调用中获取的,而不是我初始化它。那么我怎么才能"set"这里的析构函数呢?
理想情况下,我心目中的代码可能是这样的
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
运行 的原始驱逐舰。
我需要为共享指针实例编写自己的析构函数。不幸的是,这样的实例是从库函数调用中获取的,而不是我初始化它。那么我怎么才能"set"这里的析构函数呢?
理想情况下,我心目中的代码可能是这样的
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
运行 的原始驱逐舰。