关于std::unique_ptr的get()函数:是否阻止对象销毁?程序为何未崩溃?
关于std::unique_ptr::get()的疑问解答
核心结论
std::unique_ptr的get()函数不会通过引用计数阻止对象销毁——本质原因是std::unique_ptr是独占型智能指针,本身没有引用计数机制。get()仅负责返回当前智能指针持有的原始指针,不会转移所有权,也不会延长对象的生命周期。
代码问题分析
先看你给出的代码:
#include <memory> #include <iostream> int* getMemory(int N) { auto Up = std::make_unique<int[]>(N); return Up.get(); } int main() { int* array = getMemory(10); for (int i=0;i<10;++i) { array[i] = i; } for(int i =0; i< 10; ++i) { std::cout<<array[i]<<"\n"; } }
- 函数
getMemory中的局部变量Up是std::unique_ptr<int[]>,它独占着动态分配的数组内存。当函数执行完毕时,Up会被销毁,同时自动释放它管理的内存。 - 此时
Up.get()返回的原始指针array就变成了野指针——指向的内存已经被操作系统回收或标记为可用状态。
程序未崩溃的原因
这是典型的未定义行为表现。未定义行为不代表程序一定会崩溃,它的结果完全不可预测:当前编译器、运行环境下,这块内存可能暂时没被其他操作覆盖,所以读写操作“碰巧”看起来正常;但换个编译器、操作系统,或者程序执行顺序稍有变化,就可能出现崩溃、垃圾值输出,甚至更隐蔽的逻辑错误。
这种写法完全错误,绝对不能依赖这种“正常运行”的假象。如果需要让返回的内存保持有效,应该直接返回std::unique_ptr<int[]>来转移所有权,而非返回原始指针。
内容的提问来源于stack exchange,提问作者Darshan Bhat
相关产品推荐
相关产品推荐

