2015-06-18 3 views
2

я составил и запустить следующий C++ код с г ++ версии 4.8.2:Код, выполняемый после того, как ошибка произошла

vector<int> ivec{0,1,2}; 
int& iref = ivec[1]; 
for (int i=3;i<100;++i) 
    ivec.push_back(i); 
iref = 10; 
cerr<<"After Error"<<'\n'; 
return 0; 

Программа будет врезаться, как ожидается, на линии iref = 10;, поскольку ссылка аннулируется. Но строка "After Error" печатается. Зачем?

Ответ на этот вопрос очень важен для меня, потому что большую часть времени я использую cout или cerr, чтобы найти строку, вызывающую ошибку во время выполнения.

+0

Вы указали '-O0' на компиляции? – timrau

+0

Я пробовал это и ничего не меняет. – MrDetective

+0

Похоже, что 'iref = 10;' искажает стек, но это не приводит к сбою - вы не узнаете об этом до тех пор, пока 'main()' не попытается вернуться. Это объясняет, почему вы видите отладочный вывод перед сообщением об ошибке seg fault. –

ответ

6

Ваша программа имеет неопределенное поведение, потому что push_back аннулирует ссылку iref. В стандарте C++ не указывается поведение для выполнения вашей программы. На вопрос «почему» нельзя ответить в контексте C++.

+0

Итак, как мы должны отслеживать ошибки во время выполнения, вызванные неопределенным поведением? следует ли использовать «cout» вместо «cerr»? (когда я использую «cout», строка не печатается, что, вероятно, связано с тем, что выходной буфер не сбрасывается). Я думал, что «cerr» был разработан для помощи в процессе отладки. – MrDetective

+0

http://stackoverflow.com/questions/7237963/a-c-implementation-that-detects-undefined-behavior это может обеспечить некоторую проницательность – Ediac

+0

@Ediac Большое спасибо. Я искал инструмент для обнаружения неопределенного поведения (по крайней мере, большинство из них). – MrDetective

Смежные вопросы