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

为何C++的unique_ptr表现出值复制行为?代码场景解析

为什么unique_ptr的输出和原始指针不一样?

嘿,这个问题的关键在于你初始化unique_ptr的方式,咱们先看你的代码:

using namespace std; 
int main() { 
    int x = 11; 
    int* rawPointer = &x; 
    unique_ptr<int> integerPointer = make_unique<int>(x); 
    cout << *rawPointer << std::endl; 
    x++; 
    cout << *rawPointer << std::endl; 
    return 0; 
}

咱们拆解两种指针的行为:

  • 原始指针rawPointer:rawPointer = &x是直接让它指向变量x在栈上的内存地址。所以每次你解引用*rawPointer,都是直接读取x当前存储的值——当你执行x++后,x的内存里的值变成12,自然输出就跟着变了,这符合你的预期。

  • unique_ptr<int> integerPointer:你用make_unique<int>(x)创建它的时候,这个函数其实是在堆上新建了一个独立的int对象,并且把x当时的值(也就是11)复制给了这个新对象。也就是说,integerPointer指向的是一块和x完全无关的内存空间,后续修改x的值,根本不会影响到这块独立内存里的内容,所以它的输出一直是11。

如果想让unique_ptr能反映x的变化,你得让它指向x的地址,但这里要特别注意:unique_ptr的默认行为是当它生命周期结束时,会自动调用delete释放它指向的内存。但x是栈上的变量,不能被delete,直接写unique_ptr<int> integerPointer(&x);会导致程序崩溃或者未定义行为。如果只是想观察x的变化,用原始指针或者引用就足够了,unique_ptr的核心作用是管理动态分配内存的所有权,避免内存泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:19:02