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

unique_ptr能否指向普通指针?为何不符教材描述的代码可编译运行?

unique_ptr能否指向普通指针?为何示例代码可编译运行?

核心结论

unique_ptr语法上允许绑定普通指针,但这是严重的错误用法,会触发未定义行为;《C++ Primer》的描述是正确用法的规范,而非语法强制约束。

详细解释

  1. 《C++ Primer》说法的本质
    书中强调unique_ptr要绑定到new返回的指针,是因为unique_ptr的核心设计目标是管理动态分配的堆内存:它的默认删除器会在自身生命周期结束时调用delete释放所指向的内存。只有new分配的堆内存才能合法用delete释放,栈上的自动变量(比如示例中的ix)属于栈内存,不能被delete操作。

  2. 代码能编译的原因
    unique_ptr的构造函数(explicit unique_ptr(pointer p) noexcept;)语法上接受任意同类型的原始指针,编译器仅做类型匹配检查,不会验证指针指向的内存是否为动态分配。因此这段代码能通过编译,但运行时会触发未定义行为:当uq1离开作用域被销毁时,它会调用delete pi,而pi指向的是栈上的ix,这会导致程序崩溃、内存异常,或看似正常但留下潜在风险。

正确用法示例

// 绑定到new分配的堆指针(C++11及以上)
unique_ptr<int> uq2(new int(1024));

// C++14及以后推荐使用make_unique(更安全,避免内存泄漏风险)
unique_ptr<int> uq3 = make_unique<int>(1024);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 23:45:06