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

为何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对象独立维护的。

具体到你的代码流程:

  1. _surf->DeleteCell(cellId)只是在_surf自己的内部标记中,给目标单元打上删除标记,这个标记完全不会同步到surf。
  2. _surf->RemoveDeletedCells()会重新构建_surf的单元列表,过滤掉被标记删除的单元——这一步操作的是_surf专属的单元索引结构,和surf的单元列表没有任何关联。

所以最终_surf的单元数量减少,但surf的单元管理结构完全没被改动,输出自然不会有变化。如果要修改原始的surf,直接对surf调用DeleteCell和RemoveDeletedCells即可,不需要通过浅拷贝对象中转。

内容的提问来源于stack exchange,提问作者채준열

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 13:44:53