(C++) 생성자에서 throw하면(exception) 객체가 없어질까? / thread는 start() 함수로?
결론부터 말하자면 없어진다. 함수들이 전후 호출 순서 종속성이 생기는 경우 생성자에서 처리하는게 깔끔하다.
생성자에서 처리 안하고 f1()
호출하고 c f2()
호출하는 식이면, 이 호출 순서를 강제할 수 없으니 c f2()
에서 내부에 종속성 변수가 NULL
인지와 같이 잘 초기화되었는지 체크해주는 루틴이 들어가 줘야 한다.
생성자는 리턴이 안되니 exception 처리가 애매한 부분이 있었으나 throw하면 없어진다고 하니 그냥 생성자에서 초기화해주는게 좋을 것 같다.
C++ Standard 15.2
Quote: An object that is partially constructed or partially destroyed will have destructors executed for all of its fully constructed subobjects, that is, for subobjects for which the constructor has completed execution and the destructor has not yet begun execution. Should a constructor for an element of an automatic array throw an exception, only the constructed elements of that array will be destroyed. If the object or array was allocated in a new-expression, the matching deallocation function (3.7.3.2, 5.3.4, 12.5), if any, is called to free the storage occupied by the object.
Object lifetime의 정의는 constructor가 끝난 시점에서부터 destructor가 시작할 때 까지.
new에 의해 memory allocation이 일어난 후에 constructor가 불리고, 따라서, constructor에서 exception이 발생한다면, 표준에서 언급한 것처럼 (memory를 free해주기 위해) 적절한 delete가 불리게 된다.
이 때 소멸자가 불리는게 아니라, delete가 호출된다. (operator delete를 정의해서 테스트)
thread는 별도의 start() 메서드를 두는게 좋다.
이도 Object lifecycle과 관련이 있는데, 생성자에서 스레드를 생성하면 스레드 호출 객체의 생성이 아직 다 끝나지 않은 상태에서 스레드를 생성하게 된다. 그래서 별도의 start()
함수를 두고, 객체 생성이 완전히 끝난 다음 이를 호출해 스레드를 생성하는 것이 좋다.