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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 19:54:39