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

原始指针超出作用域后智能指针是否仍持有内存?附代码有效性问询

问题解答

问题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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 16:24:55