You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于C++ std::shared_ptr函数指针用法的技术咨询

std::shared_ptr函数指针用法疑问解答

先看你提到的示例代码:

void del(void(*)()) {} 
 
void fun() {} 
 
int main()
{
    std::shared_ptr<void()> ee(fun, del);
    (*ee)();
}

问题解答

1. 为何仅用std::shared_ptr<void()> ee(fun);无法初始化该shared_ptr?

std::shared_ptr的默认删除器是为动态堆内存设计的,它会在生命周期结束时调用delete释放资源。但fun是函数指针,不属于new分配的堆内存,根本不能用delete去操作。如果直接用fun初始化,编译器会报错阻止你——因为默认删除器的逻辑对函数指针完全不适用,强行运行会导致未定义行为。

2. 为何ee的构造函数需要传入两个函数(假设shared_ptr是类实现)?

第一个参数fun是shared_ptr要管理的目标对象(这里是函数指针),第二个参数del是自定义删除器。由于默认删除器不适合处理函数指针,我们必须手动告诉shared_ptr:当它要销毁管理的对象时,该执行什么操作。哪怕这个删除器是空的,也得明确指定,避免触发错误的默认销毁逻辑。

3. 自定义删除器del为何要接收函数指针作为参数?其意义是什么?

这是std::shared_ptr对自定义删除器的强制接口要求:删除器必须能接收它所管理对象的指针作为参数。这里shared_ptr管理的是void(*)()类型的函数指针,所以删除器的参数必须匹配这个类型。

这个设计的意义在于通用性:删除器需要明确知道自己要处理的目标是谁。比如如果以后你用shared_ptr管理一个需要额外清理的函数回调(比如注销某个注册的钩子),删除器就能通过这个参数拿到对应的函数指针,执行具体的清理操作。哪怕当前示例里del什么都没做,也得符合这个接口规范才能被shared_ptr正确调用。


内容的提问来源于stack exchange,提问作者Charlie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 18:12:47