C ++ 11: я исправил segfault, но я точно не знаю, что это исправило - PullRequest
0 голосов
/ 04 февраля 2020

Я изменил этот исходный код:

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);

И это исправило. Но я все еще немного озадачен, почему. Вот что делает do c для объекта 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) 

Теперь, когда я программирую время от времени и на разных языках, спецификатор stati c в C ++ сбивает с толку, но здесь он имеет имеет отношение к связыванию и продолжительности, cppref:

static - static or thread storage duration and internal linkage. 

Я должен добавить, что эта функция является частью многопоточного приложения, а stati c и thread_local в некоторых отношениях взаимозаменяемы в отношении хранения потоков.

Кто-нибудь может пролить свет на то, почему это исправление работает?

спасибо, S

1 Ответ

0 голосов
/ 13 февраля 2020

Вопрос : Кто-нибудь может пролить свет на то, почему это исправление работает?
Ответ : 1) Из предоставленной вами ограниченной информации кажется, что вы можете получить доступ temp_c0 (BRep_Tool::Curve(wd->Edge(i + 1), u11, u12)), temp_c1 (BRep_Tool::Curve(wd->Edge(j + 1), u21, u22)) после их удаления. Например, параметры функции и локальные переменные уничтожаются, когда возвращается вызов функции.
2), но stati c помещает c0 и c1 в раздел памяти, называемый «data», который доступен на протяжении всей программы.
3) И это почему это может решить проблему.
Вопрос : следует ли использовать локальную переменную stati c в многопоточном приложении?
Ответ : переменные stati c не безопасны с многопоточным приложением, потому что несколько потоков могут изменить его, так что лучше удалите его или используйте мьютекс.
Вопрос : я не самый лучший с указателями, но похоже, что аргументы требуют неизменный указатель, но данные, на которые указывает указатель, могут измениться?
Ответ : Функция требует постоянной ссылки, а не указателя. Есть разница. Указатели могут быть nullptr, и вы можете изменить указатели, чтобы они указывали на другие данные, но ссылки должны быть инициализированы и затем не могут ссылаться на другие данные. И константная ссылка означает, что данные не могут быть изменены.

...