将 TopoDS_Face 对象分配给它的子对象编译没有错误,但我有 3 个 valgrind 错误
Assigning a TopoDS_Face object to its child object compiles with no errors but I have 3 valgrind errors
我有一个名为 Test 的 class,它继承了 TopoDS_Face class。已经从 This question 那里得到了一些提示,但是...
// 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 和其他人提供 'dummy' 从 TopoDS_Shape 继承,而不添加任何字段或方法。
OCCT 不存储强类型 TopoDS_ 形状对象。 OCCT 集合(包括 TopoDS_Shape 的子形状,首先!)按值而不是引用存储 TopoDS_Shape。 TopoDS::Face() 等方法基本上将内存别名为 return 强类型对象,并根据 TopoDS_Shape::ShapeType 枚举 return( ) 方法。
实际上可共享引用以 TopoDS_Shape class 的 Handle(TopoDS_TShape) 属性 的形式存储。 TopoDS_TShape是实class定义主形数据(几何),确实是虚class与实子class es.
TopoDS_TShape 层次结构(子class 像 TopoDS_TShape、TopoDS_TShell 等)是内部的和最终的——没有用于在应用程序级别扩展此层次结构的接口。我会说,在 C++11 中,这些 classes 应该被标记为 final。
根据此描述,应该清楚改变 TopoDS_Shape / TopoDS_TShape 层次结构与 OCCT 设计相矛盾(对于这些特定的 classes)并且不能在应用程序中可靠地完成等级。假设的替代方法是使用地图(如 NCollection_DataMap<TopoDS_Shape,TopTools_ShapeMapHasher,MyShapeProperties>
)或通过文档结构(如 XCAF 文档定义装配结构 [=68= 来存储与形状相关的附加信息]等属性)。
我有一个名为 Test 的 class,它继承了 TopoDS_Face class。已经从 This question 那里得到了一些提示,但是...
// 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 和其他人提供 'dummy' 从 TopoDS_Shape 继承,而不添加任何字段或方法。
OCCT 不存储强类型 TopoDS_ 形状对象。 OCCT 集合(包括 TopoDS_Shape 的子形状,首先!)按值而不是引用存储 TopoDS_Shape。 TopoDS::Face() 等方法基本上将内存别名为 return 强类型对象,并根据 TopoDS_Shape::ShapeType 枚举 return( ) 方法。
实际上可共享引用以 TopoDS_Shape class 的 Handle(TopoDS_TShape) 属性 的形式存储。 TopoDS_TShape是实class定义主形数据(几何),确实是虚class与实子class es.
TopoDS_TShape 层次结构(子class 像 TopoDS_TShape、TopoDS_TShell 等)是内部的和最终的——没有用于在应用程序级别扩展此层次结构的接口。我会说,在 C++11 中,这些 classes 应该被标记为 final。
根据此描述,应该清楚改变 TopoDS_Shape / TopoDS_TShape 层次结构与 OCCT 设计相矛盾(对于这些特定的 classes)并且不能在应用程序中可靠地完成等级。假设的替代方法是使用地图(如 NCollection_DataMap<TopoDS_Shape,TopTools_ShapeMapHasher,MyShapeProperties>
)或通过文档结构(如 XCAF 文档定义装配结构 [=68= 来存储与形状相关的附加信息]等属性)。