0

我改变了这个源代码:

GeomAPI_ExtremaCurveCurve ecc(
                BRep_Tool::Curve(wd->Edge(i + 1), u11, u12),
                BRep_Tool::Curve(wd->Edge(j + 1), u21, u22)
            );

对此:

static Handle(Geom_Curve) c0 = BRep_Tool::Curve(wd->Edge(i + 1), u11, u12); 
static Handle(Geom_Curve) c1 = BRep_Tool::Curve(wd->Edge(j + 1), u21, u22);
GeomAPI_ExtremaCurveCurve ecc(c0, c1);

这解决了它。但我仍然有点不明白为什么。这是 GeomAPI_ExtremaCurveCurve 对象的文档:

GeomAPI_ExtremaCurveCurve (const Handle< Geom_Curve > &C1, const Handle< Geom_Curve > &C2) 

我仍然不是指针最棒的,但看起来参数需要一个不可变的指针,但是指针指向的数据可以改变吗?

然后是 BRep_Tool::Curve 方法:

static Handle< Geom_Curve > Curve (const TopoDS_Edge &E, Standard_Real &First, Standard_Real &Last) 

现在,当我偶尔使用不同的语言进行编程时,C++ 中的静态说明符令人困惑,但这里它与链接和持续时间有关,cppref:

static - static or thread storage duration and internal linkage. 

我必须补充一点,这个函数是线程应用程序的一部分,并且 static 和 thread_local 在某些方面在线程存储方面可以互换。

任何人都可以阐明为什么此修复程序有效吗?

谢谢你,S

4

1 回答 1

0

问题:任何人都可以解释为什么这个修复有效吗?
回答: 1) 从您提供的有限信息看来,您可能会在删除 temp_c0 ( BRep_Tool::Curve(wd->Edge(i + 1), u11, u12))、temp_c1 ( BRep_Tool::Curve(wd->Edge(j + 1), u21, u22)) 后访问它们。例如,一旦函数调用返回,函数参数和局部变量就会被销毁。
2)但静态将 c0 和 c1 放在称为“数据”的内存部分中,在整个程序持续时间内都可以访问。
3)这就是它可以解决问题的原因。
问题:您应该在多线程应用程序中使用静态局部变量吗?
:静态变量在多线程应用中是不安全的,因为多个线程可以修改它,所以最好删除它或使用互斥锁。
问题:我仍然不是指针最棒的,但看起来参数需要一个不可变的指针,但指针指向的数据可以改变?
:该函数需要常量引用而不是指针。它们是有区别的。指针可以是 nullptr 并且您可以更改指针以指向其他数据,但必须初始化引用,然后不能引用其他数据。并且 const 引用意味着不能更改数据。

于 2020-02-13T06:33:00.413 回答