gpt4 book ai didi

c++ - 有没有办法更改现有 shared_ptr 实例的删除操作

转载 作者:可可西里 更新时间:2023-11-01 17:57:18 25 4
gpt4 key购买 nike

我有一个函数,我希望在 90% 的时间内完成清理操作,但在 10% 的时间内我希望完成一些其他操作。

有什么方法可以使用一些标准范围的控件,例如 shared_ptr<>这样一开始它可以有一个删除操作,然后在函数中可以更改删除操作?

shared_ptr<T> ptr( new T, std::mem_fun_ref(&T::deleteMe) );
ptr.pn.d = std::mem_fun_ref(&T::queueMe);

最佳答案

不是真的 - shared_ptr 的标准以这样的方式编写 Deleter可以按值存储在控制节点(一个包含引用计数器、保存删除器、跟踪弱指针等的特殊对象)中。删除器是类型删除的,但如果你知 Prop 体的删除器类型,你可以使用 std::get_deleter<Deleter, T>(t) .有了它,您可以访问删除器并更改其状态。示例:

struct A {};

struct deleter {
void operator()(A* a) {delete a; }
int m_state;
};

std::shared_ptr<A> ptr(new A(), deleter{});

std::get_deleter<deleter>(ptr)->m_state = 5;

如果您只对所有删除器使用一个函数指针,那么是的,您可以完全替换它,因为所有潜在的删除器都使用相同的签名。

(是的,我知道这个问题已有 9 年历史了,但我在 2020 年才遇到这个问题并像这样解决了它。可能的原因是包装 C 指针和来自通过原始指针管理所有权的遗留代码的对象)

关于c++ - 有没有办法更改现有 shared_ptr 实例的删除操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3215015/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com