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

关于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 20:13:16