将TopoDS_Face对象分配给其子对象编译没有错误,但我有 3 个 valgrind 错误
Assigning a TopoDS_Face object to its child object compiles with no errors but I have 3 valgrind errors
我有一个名为Test的类,它继承了TopoDS_Face类。 已经从这个问题中获得了一些提示,但是...
// Test.h
class Test : public TopoDS_Face
{
public:
void operator = (const TopoDS_Face& base_)
{
TopoDS_Face::operator=(base_);
}
}
// testmain.cpp
...
int main() {
//extract faces from IGES face
for (int i = 1; i <= nbs; i++) {
TopoDS_Shape shape = myIgesReader.Shape(i);
TopoDS_Face& face = static_cast<TopoDS_Face&>(TopoDS::Face(shape));
Test *test;
// tried each of these also and did not succeed
// Test *test = dynamic_cast<Test*>(&face);
// test = &face
test->TopoDS_Face::operator=(face);
...
}
}
main中的代码从 IGES 文件中提取面,并将每个面对象分配给在 main 中创建的测试对象。编译进行得很顺利,但 valgrind 抱怨以下错误:
==21718== Use of uninitialised value of size 8
==21718== at 0x9B0946C: Handle_Standard_Transient::Assign(Standard_Transient const*) (in /usr/lib64/libTKernel.so.10.0.0)
==21718== by 0x408111: Handle_TopoDS_TShape::operator=(Handle_TopoDS_TShape const&) (in /home/ub/Projects/C++/test/test)
==21718== by 0x409478: TopoDS_Shape::operator=(TopoDS_Shape const&) (in /home/ub/Projects/C++/test/test)
==21718== by 0x4094CA: TopoDS_Face::operator=(TopoDS_Face const&) (in /home/ub/Projects/C++/test/test)
==21718== by 0x407273: main (in /home/ub/Projects/C++/test/test)
==21718==
==21718== Use of uninitialised value of size 8
==21718== at 0x9B09431: Handle_Standard_Transient::EndScope() (in /usr/lib64/libTKernel.so.10.0.0)
==21718== by 0x9B09475: Handle_Standard_Transient::Assign(Standard_Transient const*) (in /usr/lib64/libTKernel.so.10.0.0)
==21718== by 0x408111: Handle_TopoDS_TShape::operator=(Handle_TopoDS_TShape const&) (in /home/ub/Projects/C++/test/test)
==21718== by 0x409478: TopoDS_Shape::operator=(TopoDS_Shape const&) (in /home/ub/Projects/C++/test/test)
==21718== by 0x4094CA: TopoDS_Face::operator=(TopoDS_Face const&) (in /home/ub/Projects/C++/test/test)
==21718== by 0x407273: main (in /home/ub/Projects/C++/test/test)
==21718==
==21718== Invalid read of size 4
==21718== at 0x9B0943C: Handle_Standard_Transient::EndScope() (in /usr/lib64/libTKernel.so.10.0.0)
==21718== by 0x9B09475: Handle_Standard_Transient::Assign(Standard_Transient const*) (in /usr/lib64/libTKernel.so.10.0.0)
==21718== by 0x408111: Handle_TopoDS_TShape::operator=(Handle_TopoDS_TShape const&) (in /home/ub/Projects/C++/test/test)
==21718== by 0x409478: TopoDS_Shape::operator=(TopoDS_Shape const&) (in /home/ub/Projects/C++/test/test)
==21718== by 0x4094CA: TopoDS_Face::operator=(TopoDS_Face const&) (in /home/ub/Projects/C++/test/test)
==21718== by 0x407273: main (in /home/ub/Projects/C++/test/test)
==21718== Address 0x75eb394801c38350 is not stack'd, malloc'd or (recently) free'd
==21718==
==21718==
==21718== Process terminating with default action of signal 11 (SIGSEGV)
==21718== General Protection Fault
==21718== at 0x9B0943C: Handle_Standard_Transient::EndScope() (in /usr/lib64/libTKernel.so.10.0.0)
==21718== by 0x9B09475: Handle_Standard_Transient::Assign(Standard_Transient const*) (in /usr/lib64/libTKernel.so.10.0.0)
==21718== by 0x408111: Handle_TopoDS_TShape::operator=(Handle_TopoDS_TShape const&) (in /home/ub/Projects/C++/test/test)
==21718== by 0x409478: TopoDS_Shape::operator=(TopoDS_Shape const&) (in /home/ub/Projects/C++/test/test)
==21718== by 0x4094CA: TopoDS_Face::operator=(TopoDS_Face const&) (in /home/ub/Projects/C++/test/test)
==21718== by 0x407273: main (in /home/ub/Projects/C++/test/test)
==21718==
我需要帮助解决该程序。提前谢谢。
如果您查看TopoDS_Shape层次结构定义,您会注意到:
-
TopoDS_Shape不是接口(没有虚拟方法,也没有虚拟析构函数)。
-
TopoDS_Face、TopoDS_Shell 和其他人员提供来自TopoDS_Shape的"虚拟"继承,而无需添加任何字段或方法。
-
OCCT 不存储强类型的TopoDS_形状对象。OCCT 集合(首先包括TopoDS_Shape的子形状!)按值而不是引用存储TopoDS_Shape。像TopoDS::Face() 这样的方法基本上会执行内存别名以返回强类型对象,并根据 TopoDS_Shape::ShapeType() 方法返回的枚举进行运行时检查。
-
实际上,可共享引用以TopoDS_Shape类的 Handle(TopoDS_TShape) 属性的形式存储。TopoDS_TShape是一个定义主形状数据(几何)的真实类,它确实是具有真实子类的虚拟类。
-
TopoDS_TShape层次结构(包含 TopoDS_TShape、TopoDS_TShell 等子类)是内部的和最终的 - 没有用于在应用程序级别扩展此层次结构的接口。我想说的是,在C++11期间,这些课程预计将被标记为最终课程。
基于此描述,应该清楚的是,更改TopoDS_Shape/TopoDS_TShape层次结构与OCCT设计(针对这些特定类)相矛盾,并且无法在应用程序级别可靠地完成。假定的替代方案是使用map(如NCollection_DataMap<TopoDS_Shape,TopTools_ShapeMapHasher,MyShapeProperties>
)或文档结构(如XCAF文档定义具有TDataStd_NamedData和其他属性的装配结构)存储与形状相关的附加信息。
- 什么时候调用组成单元对象的析构函数
- valgrind-hellgrind与泄漏检查的结果不同
- 对RValue对象调用的LValue ref限定成员函数
- CMake-按正确顺序将项目与C运行时对象文件链接
- 空基优化子对象的地址
- 将对象数组的引用传递给函数
- 你能重载对象变量名本身返回的内容吗
- C++使用整数的压缩数组初始化对象
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 将对象移动到std::shared_ptr
- 代理对象的常量正确性
- 提升 ASIO 无法识别计时器对象
- 将Ref对象作为类成员
- 将包含C样式数组的对象初始化为成员变量(C++)
- 如何使Valgrind不仪器特定的共享对象
- 将TopoDS_Face对象分配给其子对象编译没有错误,但我有 3 个 valgrind 错误
- 使用 valgrind C++对象初始化和堆使用情况分析
- Valgrind在构造对象期间大小为8的写入无效
- 为什么valgrind显示泄漏,即使包含动态分配对象的向量被释放
- valgrind报告BSONObj::toString中未初始化的值,使用GENOID创建一个简单的BSON对象