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

从已释放指针移动对象会内存泄漏吗?代码行为是否符合预期?

代码分析结论:存在内存泄漏,但无拷贝、仅1次移动

核心行为拆解

  • 无拷贝操作、仅1次移动:
    代码中*ptr_to_class_member = std::move(*first.release());执行的是移动赋值操作,只会触发T的移动赋值运算符,全程没有调用拷贝构造或拷贝赋值函数,确实满足无拷贝、仅1次移动的预期。

  • 存在内存泄漏:
    first.release()的作用是将unique_ptr持有的裸指针返回,同时让first放弃对该内存的所有权。后续代码仅对这个指针指向的T对象做了资源转移(move),但没有释放对象本身占据的堆内存——move操作不销毁原对象,只是转移其内部资源,因此这块堆内存会因为没有被delete或智能指针接管而泄漏。

修正方案

如果要实现无拷贝、仅1次移动且无内存泄漏的目标,推荐两种写法:

写法1:直接移动后让智能指针自动管理(更简洁)

std::unique_ptr<T> first = Get();
…
T* ptr_to_class_member = GetPtr(obj);
*ptr_to_class_member = std::move(*first);
first.reset(); // 显式重置,也可以省略,first离开作用域时会自动释放空指针

写法2:使用release后手动释放内存(不推荐,除非必须)

std::unique_ptr<T> first = Get();
…
T* ptr_to_class_member = GetPtr(obj);
T* temp_ptr = first.release();
*ptr_to_class_member = std::move(*temp_ptr);
delete temp_ptr; // 手动释放原对象的堆内存,避免泄漏

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 10:30:54