C++/Exception 2021. 3. 22. 00:13

예외 처리의 위험성과 단점

메모리 누수

  • throw 이후의 코드는 무시되기 때문에, 메모리 누수가 발생할 가능성이 존재한다.

    #include <iostream>
    
    using namespace std;
    
    int            main()
    {
      try
      {
        int* i = new int[100000];
    
        throw "error";
    
        delete[] i;
      }
      catch (...)
      {
        cout << "Catch\n";
      }
    }
    
    /* stdout stderr
    Catch
    */
    • unique_ptr를 사용하여 해결할 수 있다.

소멸자에서 throw 사용 금지

  • 소멸자에서는 throw의 사용이 금지되어있다.

    • 만약 사용하면 런타임 에러가 발생한다.
    #include <iostream>
    #include <memory>
    
    using namespace std;
    
    class A
    {
    public:
      ~A()
      {
        throw "error";
      }
    };
    
    int            main()
    {
      try
      {
        A a;
      }
      catch (...)
      {
        cout << "Catch\n";
      }
    }
    warning C4297: 'A::~A': function assumed not to throw an exception but does
    message : destructor or deallocator has a (possibly implicit) non-throwing exception specification