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

C++智能指针与异常:shared_ptr构造编译错误排查

问题分析与修复

编译错误根源

std::shared_ptr的自定义删除器要求函数参数必须是指向管理对象的指针类型(这里就是connection*),但你定义的disconnect函数参数是connection(值传递),类型不匹配,编译器找不到对应的shared_ptr构造函数重载,因此报出C2661错误。

隐藏的逻辑漏洞

除了编译错误,代码还有致命的逻辑问题:

  • connect函数里的shared_ptr<connection>是局部变量,函数返回时这个智能指针会被销毁,立刻触发disconnect关闭连接。但函数返回的是*pConn(智能指针管理对象的副本),这意味着连接在函数返回瞬间就被关闭了,返回的connection副本完全没有实际连接的意义,违背了用智能指针管理资源生命周期的初衷。

修正代码

1. 调整删除器参数类型

把disconnect的参数改为connection*,匹配shared_ptr的要求:

void disconnect(connection* c)
{
    cout << "Socket(" << c->ip << "," << c->port << ") disconnect" << endl;
}

(注:原代码里的输出有笔误,已将第二个c.port改为c->ip,避免输出两个端口号)

2. 修改connect函数的返回值

不能返回connection对象,应该返回shared_ptr<connection>,让调用方持有智能指针来控制连接生命周期:

shared_ptr<connection> connect(destination* pDest)
{
    shared_ptr<connection> pConn(new connection(pDest->ip, pDest->port), disconnect );
    cout << "Socket(" << pConn->ip << "," << pConn->port << ") connect" << endl;
    return pConn;
}

3. 更新f函数的调用逻辑

void f(destination& d)
{
    shared_ptr<connection> c = connect(&d);
    // 在此处使用连接,离开函数作用域时,shared_ptr会自动调用disconnect关闭连接
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 16:07:24