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
相关产品推荐
相关产品推荐

