原始指针超出作用域后智能指针是否仍持有内存?附代码有效性问询
问题解答
问题1:当原始指针超出作用域时,智能指针是否仍持有已分配的内存?
是的,智能指针的核心作用就是接管动态内存的所有权。只要智能指针自身还在有效作用域内、且没有被重置或释放,它就会一直持有对应的内存块——原始指针只是一个指向内存的"地址载体",它的销毁不会影响内存本身的存在,智能指针会负责在自身生命周期结束或被主动重置时释放内存。
问题2:以下代码是否合法?
先贴出代码:
std::unique_ptr<int> x; if (true) { // 假设此处有一个求值为true的条件 int * y = new int(5); // 假设此处是一个返回指针的函数调用 x.reset(y); } // x是否仍持有已分配的内存? // y超出作用域是否会有影响? cout << *x << endl; // 5
这段代码合法且行为完全正确,具体说明:
x是定义在外部作用域的unique_ptr,在if块内调用x.reset(y)后,x正式接管了y指向的堆内存的所有权。y作为原始指针,在if块结束后会被销毁,但这只是销毁了指针变量本身,不会触动它之前指向的那块内存——因为内存的所有权已经转移给x了。- 所以在
if块外部,x仍然持有该内存,解引用*x能正确得到值5,程序运行不会出现问题。
需要额外注意:如果后续再让其他指针(原始指针或智能指针)接管同一块内存,会导致重复释放的未定义行为,但这段代码里不存在这个风险。
内容的提问来源于stack exchange,提问作者Aristotelis Vontzalidis
相关产品推荐
相关产品推荐

