为何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
相关产品推荐
相关产品推荐

