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

为何指向同一资源的裸指针与unique_ptr不会引发问题?(C++)

关于std::unique_ptr::get()的疑问解答

首先要明确:std::unique_ptr的“独占”指的是独占资源的所有权——也就是只有它负责资源的释放,而不是禁止其他指针临时访问资源。

为什么允许使用get()生成裸指针?

  • 兼容遗留代码:很多现有函数只接受裸指针作为参数(比如你示例中的changeValue),get()的存在让unique_ptr能无缝对接这类场景,无需重构旧代码。
  • 满足临时访问需求:有时候需要获取裸指针进行不涉及所有权的操作(比如读取、修改资源值),只要保证裸指针的使用周期完全在unique_ptr持有资源的期间内,就不会有问题。

你的代码示例分析

在你的代码中:

auto smrtPtr{ std::make_unique<int>(5) };
changeValue(smrtPtr.get());

smrtPtr始终持有资源的所有权,get()返回的裸指针仅在changeValue函数执行期间有效,函数结束后该裸指针就不再被使用。changeValue只是修改了资源的值,并没有尝试释放资源或延长裸指针的生命周期,完全没有破坏unique_ptr的独占规则。

需要注意的风险

虽然get()是合法的,但如果将返回的裸指针长期保存,后续unique_ptr释放资源后,这个裸指针就会变成悬空指针,引发未定义行为。这属于使用不当,而非get()设计的问题——使用时必须确保裸指针的使用范围不超过unique_ptr的有效生命周期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 10:32:36