C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[67450] Re:C++에서 Local Variable Destructor 에 대한 질문입니다.
Starlet [starlet5] 906 읽음    2012-06-11 14:35
안녕하세요.
책의 내용은,
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 . . .

+ -

관련 글 리스트
67447 C++에서 Local Variable Destructor 에 대한 질문입니다. 즈티브삽스 874 2012/06/11
67450     Re:C++에서 Local Variable Destructor 에 대한 질문입니다. Starlet 906 2012/06/11
67461         Re:Re: 답변에 감사드립니다. 즈티브삽스 872 2012/06/12
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.