How to issue a c++ termination catch without a OOM killer

谁都会走 提交于 2020-03-03 14:00:44

问题


I am learning about exceptions from a book and try/catch and the OS should terminate the following program.

The book says, the message terminate called after throwing an instance of 'std::bad_alloc' should show up. But doesn't.

I am using Arch Linux and the program is not stopping. It runs, fills the RAM a bit linear until it doesn't (at about 90%), the processor is working a lot but no freezing and no terminating. Is this a Windows only use case or how could I reproduce the error on a Linux/maybe Unix system?

    #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;
    }

EDIT: I found out that my OOM killer is not working properly with swap enabled/at all. But c++ has its own termination process call https://en.cppreference.com/w/cpp/error/terminate It just doesn't issues an exception to print out the catch line. Has anyone a hint to issue a catch termination?


回答1:


I found the following code for you to program some terminations: Hope that helps.

    #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();
    }



回答2:


Just for the sake of being helpful if someone steps into the same problem a coded thrown exception after 100000 loops:

    #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;
        }


来源:https://stackoverflow.com/questions/60401204/how-to-issue-a-c-termination-catch-without-a-oom-killer

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!