std::shared_ptr转int*编译错误及规范写法咨询
问题解决与优化建议
错误原因
你的编译错误确实是指针类型不匹配:test类的构造函数需要int*类型的参数,但你传递的是std::shared_ptr<int>,这两个类型之间没有隐式转换规则,因此编译器报错。
关于&(*x)的写法
你用&(*x)的方式确实能绕过编译错误,但这种写法存在两个明显问题:
- 代码可读性差,不符合常规编码风格,其他开发者看到会感到困惑
- 安全性不足:如果
x是空的shared_ptr,*x会触发未定义行为(通常是程序崩溃),&(*x)自然也会跟着出错
优化方案
方案1:使用shared_ptr的get()成员函数(推荐)
std::shared_ptr提供了标准的get()方法,用于获取其管理的原始指针,这是获取智能指针底层原始指针的常规写法,代码清晰且安全:
std::shared_ptr<test> t = std::make_shared<test>(x.get());
如果x是空指针,get()会返回nullptr,不会触发未定义行为,比&(*x)更可靠。
方案2:修改test类的构造函数(更符合智能指针设计)
如果业务逻辑允许,建议直接让test的构造函数接受std::shared_ptr<int>,这样可以利用智能指针的所有权管理机制,避免潜在的悬空指针问题:
#include <memory> #include <vector> class test { public: std::shared_ptr<int> x_; // 改用shared_ptr管理资源 test(std::shared_ptr<int> x) : x_(x) {} }; int main(int argc, char *argv[]) { auto x = std::make_shared<int>(5); std::shared_ptr<test> t = std::make_shared<test>(x); }
这种方式不需要手动处理原始指针,智能指针会自动管理内存生命周期,更符合C++现代编程的理念。
内容的提问来源于stack exchange,提问作者RyanChen.YLC
相关产品推荐
相关产品推荐

