为何指向同一资源的裸指针与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
相关产品推荐
相关产品推荐

