|
큰 도움이 됐습니다.
쉽게 말해서, function2()가 종료되는 시점에서 A 객체의 소멸자가 호출되는데,
function2() 내부에서 function1() 함수가 호출되었고 이 function1() 함수가 exception을 throw 했기 때문에 현재의 코드로써는 exception이 throw된 다음에야 객체가 소멸된다는 이야기였네요.
try {} 내부에 별도의 {}을 만들어 거기 내부에서 객체를 생성했더니 과연 exception을 throw 하기 전에 객체가 먼저 소멸됐습니다.
그런데 이건 약간 꼼수 같은데. 보다 정공법스런 방법은 없을까요?
int main()
{
try
{
{
A a; //function2() 내부의 객체 A a를 여기로 옮겼다..
}
cout << "function2 is called inside main" << endl;
function2();
}
catch( runtime_error &error)
{
cout << "Exception occurred!! " << error.what() << endl;
cout << "Exception is handled in main()" << endl;
}
return 0;
}
Starlet 님이 쓰신 글 :
: 안녕하세요.
: 책의 내용은,
: exception을 throw하게 되면(throw가 실행되면) 그 아래 코드는 실행되지 않기 때문에, 생성된 객체들이 있으면 throw 하기 전에 반환(delete)하라는 말입니다.
:
: 그리고 작성하신 예제에서는 A라는 클래스를 함수 안에서 정의했기 때문에 저런 결과가 나옵니다. 함수 안에서 정의된 변수들은 함수가 일을 다하면 모두 반환됩니다.
: function2에서 functions1을 실행하면 function1이 throw를 날리며 거기서 function1은 작업을 마칩니다. function1의 throw 아래에 코드가 있어도 실행되지 않습니다. function2에서는 function1을 호출하고, function1이 할 일을 다 한 이후에 function2에 아무 코드가 없기 때문에 fcuntion2가 종료되며 정의된 A a; 클래스를 반환합니다. 이 때 A 클래스의 destructor가 호출됩니다.
: 글 재주가 없어서 이해가 되실지 모르겠네요 ^^
:
: 즈티브삽스 님이 쓰신 글 :
: : 현재 영어 원서를 가지고 공부를 하고 있는데. 이 책이 해답지가 없어서 여기에 질문을 하고자 합니다.
: :
: : 오늘 첫 가입해서 아직 익숙하지 않습니다. 혹 제가 잘못된 게시판에서 글을 쓰고 있다면 말씀해주세요. 다음번에는 올바른 게시판에서 쓰겠습니다.
: :
: : 문제는 다음과 같네요.
: :
: : Write a program illustrating that all destructors for objects constructed in a block are called before an exception is thrown from that block.
: :
: : 제 방식대로 번역을 해보자면...
: :
: : 모든 소멸자(destructors)가 block 내부에서 생성된 객체를, 해당 block에서 exception이 throw 되기 "전(before)"에 호출하십시오.
: :
: : 저 같은 경우 일단 stack unwinding을 써서 시도를 해봤는데, 소멸자가 exception이 throw 된 후에 호출이 되더군요. 혹시 다른 방법이 있을까요? 아니면 제 코드를 수정하면 될까요. 제 코드는 다음과 같습니다.
: :
: :
: : #include <iostream>
: : #include <stdexcept>
: : using namespace std;
: :
: :
: : class A
: : {
: : public:
: : A()
: : {
: : cout << "Ctor is created!" << endl;
: : }
: : ~A()
: : {
: : cout << "Dtor is destroying!" << endl;
: : }
: : };
: :
: : void function1() throw( runtime_error )
: : {
: : cout << "In our function1 throw exception!" << endl;
: :
: : throw runtime_error("runtime_error in function");
: : }
: :
: : void function2() throw( runtime_error )
: : {
: : A a;
: : cout << "In our function2" << endl;
: : function1();
: : }
: :
: :
: : int main()
: : {
: : try
: : {
: : cout << "function2 is called inside main" << endl;
: : function2();
: : }
: : catch( runtime_error &error)
: : {
: : cout << "Exception occurred!! " << error.what() << endl;
: : cout << "Exception is handled in main()" << endl;
: : }
: :
: : return 0;
: : }
: :
: :
: : 현재 결과값은 다음처럼 나오네요.
: :
: : function2 is called inside main
: : Ctor is created!
: : In our function2
: : In our function1 throw exception!
: : Dtor is destroying! //소멸자가 exception이 throw된 후에 호출...
: : Exception occurred!! runtime_error in function
: : Exception is handled in main()
: : Press any key to continue . . .
|