C++中静态节点树的CNodeStatic类析构函数应如何定义?
问题核心原因
你写delete pc_parent_node报错的根本原因是:pc_parent_node是无所有权的观察指针,仅用于指向父节点的位置,父节点的内存并不由当前子节点负责分配和回收,贸然delete不属于自身管理的内存,会触发非法内存释放、重复释放、父节点提前销毁等严重问题。
类内存模型说明
你的设计里子节点容器v_children存储的是CNodeStatic对象实例而非指针,所有子节点的内存完全由父节点的vector自动管理:父节点销毁时,vector会自动调用每个子元素的析构函数,递归完成整棵子树的内存回收,不需要手动管理子节点内存。
析构函数实现
CNodeStatic析构函数
无需任何手动内存操作,空实现即可:
CNodeStatic::~CNodeStatic() { // 无需要释放的资源:pc_parent_node无所有权不能释放,v_children自动管理内存 }
如果你的编译器支持C++11及以上标准,也可以直接在类定义里声明为默认析构:
~CNodeStatic() = default;
CTreeStatic析构函数
根节点c_root是类的成员对象,类销毁时会自动调用根节点的析构函数触发整棵树的递归销毁,所以同样为空实现即可:
CTreeStatic::~CTreeStatic() { // 无需额外操作,根节点自动销毁时会清理所有子节点资源 }
C++11及以上也可以用~CTreeStatic() = default;简化。
额外注意事项
- 实现
vAddChild接口时,一定要将新加入的子节点的pc_parent_node赋值为当前节点,避免父指针为空 - 实现
bMoveSubtree接口时,要先将待移动节点从原父节点的v_children中移除,再添加到新父节点的v_children中,同时更新待移动节点的pc_parent_node指向新父节点
内容的提问来源于stack exchange,提问作者NN ZZ
相关产品推荐
相关产品推荐

