动态分配的含std::unordered_map成员的结构体被delete时,内部容器会析构吗?
问题解答
结构体内部的std::unordered_map会被析构吗?
会的。当你执行delete handle;时,C++会先调用holder对象的析构函数——由于你没有自定义析构函数,编译器会自动生成一个默认析构函数。这个默认析构函数会自动调用结构体中每个非静态成员的析构函数,包括num_to_addr这个std::unordered_map实例。
std::unordered_map作为标准库容器,其析构函数会负责清理自身管理的所有内存:包括存储的键值对、内部哈希表结构等,所以这部分内存会被正确释放,不会因为这个结构体的析构而产生泄漏。
关于你遇到的间歇性内存泄漏
既然这段代码本身不会导致内存泄漏,那泄漏的根源大概率在其他地方,你可以从这些方向排查:
- 检查是否存在某些代码分支中,
handle没有被执行delete(比如异常抛出后跳过了释放逻辑); - 排查业务操作中其他动态分配的资源(比如其他裸指针、自定义的内存管理对象)是否未正确释放;
- 确认是否存在多线程场景下的资源竞争,导致内存释放逻辑被异常跳过;
- 若后续修改过结构体,新增了需要手动释放的成员(比如裸指针),那需要在自定义析构函数中补充释放逻辑。
内容的提问来源于stack exchange,提问作者Troy Hamilton
相关产品推荐
相关产品推荐

