여기에서 여러 기사를 읽었으며 예외적으로 생성자에서 예외를 throw하는 것이 좋습니다. 그러나 생성자에서 예외가 발생하면 기본 클래스 또는 데이터 멤버의 소멸자를 호출하지 않는다는 것을 알았습니다. 다음 예를 고려C++의 생성자에서 예외를 throw하는 중
이때#include <iostream>
using namespace std;
struct C
{
C() { cout << __FUNCTION__ << endl; }
~C() { cout << __FUNCTION__ << endl; }
};
struct E: public C
{
C c;
E() { cout << __FUNCTION__ << endl; throw 4; }
~E() { cout << __FUNCTION__ << endl; }
};
int main()
{
E e;
}
$ g++ test.cpp; ./a.exe
C
C
E
terminate called after throwing an instance of 'int'
Aborted (core dumped)
는 E 생성자 예외가 발생하지만, 데이터 또는 부재로서의 기본 클래스 C의 소멸자가 호출되지 않는다. 이제 C의 소멸자가 파일/소켓 닫기 및 힙 할당 삭제와 같은 정리 작업을 수행하면 문제가 발생할 수 있습니다.
그래서 내 질문에 왜 예외가 생성자에서 예외를 throw 할 수 있습니다.
'main'에서 예외를 잡으면 소멸자가 호출됩니다. [here] (http://ideone.com/nQemT)를 참조하십시오. –
예외 사용에 익숙해지기 전에 [this] (http://stackoverflow.com/questions/1744070/why-should-exceptions-be-used-conservatively) 및 관련 질문을 읽어보십시오. – Shahbaz