메뉴 바로가기 검색 및 카테고리 바로가기

한빛미디어

뇌를 자극하는 C++ 프로그래밍

뇌를 자극하는 C++ 프로그래밍 질의응답 게시판입니다.

C++ 레퍼런스 관련 질문입니다.

2008-01-24

|

by sakara84

2390

C++ 레퍼런스 관련 질문입니다.

#include
using namespace std;

class CLS {
private:
          int x;
public:
          CLS(int ax) : x(ax) {
                    cout << "생성되었음" << endl;
          }
          virtual ~CLS(void) {
                    cout << "파괴되었음" << endl;
          }
          void PrintExam(void) {
                    printf("출력성공? : %d\n", x);
          }
};

CLS& function(CLS& obj) {
          obj.PrintExam();
          return obj;
}
  
int main(int argc, char *argv[]) {
          CLS &obj = function(CLS(10));
          obj.PrintExam();
}

위 소스코드의 실행결과 (VC++ 8.0 기준입니다) 다음과 같습니다.

생성되었음
출력성공? : 10
파괴되었음
출력성공? : 10

function함수는 CLS(10)으로 생성한 객체를 레퍼런스로 받아서 x값을 출력한 다음 다시 객체를 레퍼런스로
출력합니다. 그 레퍼런스는 CLS &obj에 대입되고, CLS(10)은 파괴자가 호출되어서 파괴됩니다. 하지만
CLS &obj 로 받은 객체로 obj.PrintExam() 을 실행해보면 다시 10이 나옵니다.

여기서 질문입니다. 왜 객체가 파괴되었는데 값은 똑같이 나오는 겁니까? 파괴자가 한번만 호출되는 것을 봐서 객체가 하나만 생성된 것은 확실해 보입니다. 혹시 주소가 틀린가 해서 x변수의 주소도 비교해보았지만, 주소도 같았습니다. 그렇다면 정적 객체생성일시 파괴자는 그 객체의 메모리를 해제할때 메모리를 쓰레기값으로 만드는게 아닌, 그 부분의 메모리에 대한 접근권한을 허용하도록 바꾸어주는 건가요?

혹시나 해서, new로 동적 생성을 한 후 delete선언 후 x에 해봤을때는 쓰레기값을 가지더군요.

파괴자의 정확한 동작원리 좀 알려주시기 바랍니다.
댓글 입력
자료실