为何C++中VTK对象浅拷贝的修改不会影响原对象?
问题描述
编写了如下C++代码:
vtkNew _surf; _surf->ShallowCopy(surf); vtkIdType cellId = Get_ClosestCellId(_surf, seedxyz); _surf->DeleteCell(cellId); _surf->RemoveDeletedCells();
创建_surf后,将其指定为surf的浅拷贝(ShallowCopy),随后调用_surf->DeleteCell删除距离seedxyz最近的单元。原本认为通过浅拷贝方式,_surf和surf会共享指针,对_surf的修改也会反映在surf上,但将两者输出为vtp格式后,发现_surf已被修改,而surf并未体现相应变化,请问这是为什么?
原因分析与解释
VTK的ShallowCopy并非让两个对象完全共享所有内部结构,其核心共享逻辑和你理解的有差异:
- 共享的部分:浅拷贝会让
_surf和surf共享点(Points)、点数据(PointData)、单元数据(CellData)这些底层数组资源,节省内存开销。 - 独立的部分:单元的管理结构(包括单元列表、删除标记)是每个VTK对象独立维护的。
具体到你的代码流程:
_surf->DeleteCell(cellId)只是在_surf自己的内部标记中,给目标单元打上删除标记,这个标记完全不会同步到surf。_surf->RemoveDeletedCells()会重新构建_surf的单元列表,过滤掉被标记删除的单元——这一步操作的是_surf专属的单元索引结构,和surf的单元列表没有任何关联。
所以最终_surf的单元数量减少,但surf的单元管理结构完全没被改动,输出自然不会有变化。如果要修改原始的surf,直接对surf调用DeleteCell和RemoveDeletedCells即可,不需要通过浅拷贝对象中转。
内容的提问来源于stack exchange,提问作者채준열
相关产品推荐
相关产品推荐

