从已释放指针移动对象会内存泄漏吗?代码行为是否符合预期?
代码分析结论:存在内存泄漏,但无拷贝、仅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
相关产品推荐
相关产品推荐

