首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++11 :我修补了一个段错误,但我不知道到底是什么修复了它

C++11 :我修补了一个段错误,但我不知道到底是什么修复了它
EN

Stack Overflow用户
提问于 2020-02-04 19:29:52
回答 1查看 133关注 0票数 0

我更改了这个源码:

代码语言:javascript
复制
GeomAPI_ExtremaCurveCurve ecc(
                BRep_Tool::Curve(wd->Edge(i + 1), u11, u12),
                BRep_Tool::Curve(wd->Edge(j + 1), u21, u22)
            );

要这样做:

代码语言:javascript
复制
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对象的文档:

代码语言:javascript
复制
GeomAPI_ExtremaCurveCurve (const Handle< Geom_Curve > &C1, const Handle< Geom_Curve > &C2) 

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

然后是BRep_Tool::Curve方法:

代码语言:javascript
复制
static Handle< Geom_Curve > Curve (const TopoDS_Edge &E, Standard_Real &First, Standard_Real &Last) 

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

代码语言:javascript
复制
static - static or thread storage duration and internal linkage. 

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

有没有人能解释一下为什么这个修复是有效的?

谢谢你,S

EN

回答 1

Stack Overflow用户

发布于 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,您可以将指针更改为指向其他数据,但引用必须初始化,然后不能引用其他数据。常量引用表示数据不能更改。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60056428

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档