В какой-то момент код моего большого проекта начал получать ошибка сегментации ошибки времени выполнения с такой трассировкой стека:
0 # std :: basic_ ios> :: widen (__c = 10 '\ n', это =) в /usr/include/c++/7/bits/basic_ios.h:450
1 # std :: endl> (__os = ...) в / usr / include / c ++ / 7 / ostream: 591
2 # std :: ostream :: operator << (__pf =, this =) в / usr / include / c ++ / 7 / ostream: 113 <br>3 # main () в segfault. cpp: 11
, где last (3 #) всегда указывал на std :: cout строки типа std::cout << "hello" << std::endl;
Итак, я свел свой код к этой минимальной конструкции, которая все еще вызывает ту же ошибку:
#pragma pack(1)
struct Point {
int x;
};
#include <iostream>
int main()
{
for(;;){
std::cout << "hello" << std::endl;
}
}
, которая построена с помощью команды g++ -std=c++17 segfault.cpp -o segfault -g -Ofast
.
Выполнение любых из следующее отменяет ошибку:
- удаление
#pragma pack(1)
- удаление
-Ofast
из g ++ опции - удаление
for(;;){
(перемещение std::cout ...
из l oop) - движется
#include <iostream>
до #pragma pack(1)
Пробное здание с g ++ 7.4. 0 и g ++ 9.2.1 (те же результаты).