Как создать C ++ завершение перехвата без OOM Killer - PullRequest
1 голос
/ 25 февраля 2020

Я изучаю исключения из книги и пытаюсь / ловлю, и ОС должна прекратить выполнение следующей программы.

В книге сказано, что должно появиться сообщение terminate called after throwing an instance of 'std::bad_alloc'. Но не.

Я использую Arch Linux, и программа не останавливается. Он работает, заполняет ОЗУ немного линейно до тех пор, пока не будет (примерно на 90%), процессор работает много, но не зависает и не завершает работу. Это Windows только случай использования или как я могу воспроизвести ошибку в системе Linux / возможно Unix?

    #include <iostream>
    #include <exception> //c++ exception

    int main()
    {
    int *feld;
    int loop = 1;

    for(;;) //infinite loop
    {
      std::cout << "Loop number: " << loop << '\n';
      try
      {
      feld = new int[10000];
      loop++;
      if (durchlauf == 100000) //since c++11
            std::terminate();
      }
      catch(...)
        {

        std::cout << "Error, Program done.\n";

        break;
        }
      }
    return 0;
    }

РЕДАКТИРОВАТЬ: я обнаружил, что мой убийца OOM не работает должным образом с swap включено / вообще. Но у c ++ есть свой собственный вызов процесса завершения https://en.cppreference.com/w/cpp/error/terminate Он просто не выдает исключение для вывода строки перехвата. Кто-нибудь намекнул выдать прекращение улова?

Ответы [ 2 ]

1 голос
/ 25 февраля 2020

Я нашел следующий код для программирования некоторых окончаний: Надеюсь, это поможет.

    #include <iostream>
    #include <stdexcept>

    struct A {
        int n;
        A(int n = 0): n(n) { std::cout << "A(" << n << ") constructed successfully\n"; }
        ~A() { std::cout << "A(" << n << ") destroyed\n"; }
    };

    int foo()
    {
        throw std::runtime_error("error");
    }

    struct B {
        A a1, a2, a3;
        B() try : a1(1), a2(foo()), a3(3) {
            std::cout << "B constructed successfully\n";
        } catch(...) {
            std::cout << "B::B() exiting with exception\n";
        }
        ~B() { std::cout << "B destroyed\n"; }
    };

    struct C : A, B {
        C() try {
            std::cout << "C::C() completed successfully\n";
        } catch(...) {
            std::cout << "C::C() exiting with exception\n";
        }
        ~C() { std::cout << "C destroyed\n"; }
    };

    int main () try
    {
        // creates the A base subobject
        // creates the a1 member of B
        // fails to create the a2 member of B
        // unwinding destroys the a1 member of B
        // unwinding destroys the A base subobject
        C c;
    } catch (const std::exception& e) {
        std::cout << "main() failed to create C with: " << e.what();
    }
0 голосов
/ 26 февраля 2020

Просто для того, чтобы быть полезным, если кто-то вступит в ту же проблему, закодированное выброшенное исключение после 100000 циклов:

    #include <iostream>
    #include <exception> //c++ exception

        int main()
        {
        int *feld;
        int loop = 1;

        for(;;) //infinite loop
        {

          std::cout << "Loop number: " << loop << '\n';
          try
          {
             feld = new int[10000];
             loop++;
             if (loop == 1e5)
                throw std::bad_alloc(); //has to be inside the try(){} scope
          }

          catch(...)
            {

            std::cout << "Error, Program done.\n";

            break;
            }
          }
        return 0;
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...