我更改了这个源码:
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
发布于 2020-02-13 14:33:00
works :有谁能解释一下为什么这个修复会起作用?
Answer: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)这就是为什么它可以解决这个问题。
multi:是否应该在多线程应用程序中使用静态局部变量?
Answer:静态变量在多线程应用程序中是不安全的,因为多线程可以修改它,所以最好删除它或使用互斥。
require :我在指针方面仍然不是最棒的,但是看起来参数需要一个不可变的指针,但是指针指向的数据可以改变吗?
Answer:函数需要常量引用而不是指针。这是有区别的。指针可以是nullptr,您可以将指针更改为指向其他数据,但引用必须初始化,然后不能引用其他数据。常量引用表示数据不能更改。
https://stackoverflow.com/questions/60056428
复制相似问题