Shubham Avasthi Ответов: 3

Эта программа C++ не может быть завершена с помощью ctrl + C. Почему?


Я работал над кодом C++, который по какой-то неизвестной причине не завершается Ctrl + C.

Приведенный ниже код является уменьшенной версией кода, над которым я работал, и он имеет ту же проблему. Более того, если я не принимаю входные данные для M (remove '>>M') или удаляю вектор a(n), или инициализирую размер вектора a целочисленным литералом вместо этого, или компилирую код без флага компилятора-O3, программа завершается Ctrl + C, как и ожидалось.

операционная система: Windows 10
Компилятор: Компилятор MinGW
Команда компиляции: g++ -O3 -std=c++14

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    int N,M;
    cin>>N>>M;
    vector a(N);
}


Что я уже пробовал:

Я понятия не имею, почему происходит такое поведение, и не могу найти никаких ресурсов, чтобы объяснить то же самое.

3 Ответов

Рейтинг:
2

Stefan_Lang

Я сильно подозреваю, что это ошибка в оптимизации кода компилятора: M не читается программой, поэтому компилятор попытается устранить код, ссылающийся на него, - возможно, он испортил эту оптимизацию, потому что оператор cin>>N>>M внутренне преобразуется во вложенный вызов функции: operator>>(operator>>(cin, N), M) Оптимизация M из этого вложенного вызова может быть сложной задачей для компилятора в отношении того, как влияет состояние cin . - может быть, он остался в страте, где съедает все входные данные, включая ^C ...

Отключение оптимизации, принудительное чтение на M позже в программе или разделение входной строки на две части-все это может помочь избежать этой ошибки, но поскольку у меня нет MinGW, я не могу это проверить.

Хотя, конечно, вы никогда не можете быть уверены, что избежите ошибки компилятора, о которой вы не знаете, я обнаружил, что, если программа не делает то, что она должна делать, лучше всего упростить операторы кода и посмотреть, поможет ли это.


Рейтинг:
1

RickZeeland

Возможно, это проблема с отладчиком, см.: Обходной путь для прерывания GDB Ctrl-C | MinGW[^]


Рейтинг:
0

CPallini

На моем Linux box (Ubuntu 18), следующая программа

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    int N,M;
    cin>>N>>M;
    vector<int> a(N);
}

скомпилировано с помощью g++ -O3 -std=c++14 (g++ 7.4.0) ведет себя так, как и предполагалось.


Stefan_Lang

То же самое для vc14.0 на W10. Для меня это звучит как проблема оптимизации кода компилятора.