객체 와 객체 포인터의 소멸자 호출 방식

조회수 3025회

ClassName이 Test라고 가정

Test fTest; Test *sTest;

컴파일러는 스택에 할당된 객체들에 한해서만 소멸자를 자동으로 호출해주는건가요 ? 그래서 fTest는 컴파일러에서 알아서 소멸자를 호출 해주는건가요 ?

객체 포인터인 sTest의 경우는 소멸자를 delete 연산자를 이용해 호출 해야 하는건 힙 영역이라 컴파일러의 영역이 아니라서 그런거구요 ?

단순히 책이나 글로는 소멸자를 호출해준다로만 되어있어서 자세히 알고 싶습니다.

컴파일러가 객체의 소멸자를 호출해주는 기준이 스택에 생성되어있는 객체에 한해서라서

전자의 경우는 소멸자가 자동으로 호출되고 후자의 경우는 직접 delete 연산자를 통해 호출 해줘야 하는건지 궁금합니다.

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • 이 질문은 컴파일러보다는 변수의 생명주기와 관련있습니다.

    A.

    Test fTest;
    

    위 변수와 같은 형태는 통상 함수안에 있는 경우, 선언된 시점부터 함수가 종료되는 시점까지만 변수가 존재합니다. 즉, 언제 탄생하고, 언제 소멸되는지 명확합니다.

    즉, 변수의 생명주기 = 객체의 생명주기 인 경우입니다.

    B.

    Test *sTest;
    

    위와 같이 포인터는 포인터 자체에 대한 변수 생명주기만 관리합니다. 즉 포인터가 가리키고 있을 어떤 객체는 다른 규칙에 의해서 객체 생명주기가 관리됩니다.

    예를 들어 포인터 sTest가 fTest를 가리키고 있었다면, fTest가 탄생하고 소멸되기 전에 참조할 때에만 유효하며, 소멸된 후에는 더 이상 유효하지 않게 됩니다. 그리고 fTest와 sTest는 서로 다른 변수 임으로 sTest가 가리키는 fTest가 소멸된다고 해서, sTest에 어떠한 영향을 주지 않습니다.

    단지 sTest를 통해서 fTest에 접근하는 시점이 언제냐에 따라서 오류가 발생할 수고 있고, 정상적으로 동작할 수도 있습니다.

    즉 포인터는 객체 생명 주기에 아무런 일도 하지 않습니다.

    C.

    또 다른 생명 주기 관리방식은 new와 delete입니다. new 에 의해서 생성된 객체는 delete를 만날 때에만 소멸됩니다. 이 경우는 객체의 생명주기를 직접 관리하는 방법이기 때문에, 변수의 생명주기와는 관련이 없어지게 됩니다.

    통상 함수운용중에 사용하는 로컬변수는 실행스택에 존재하며, new/delete에 의해 할당된 객체는 힙에 존재합니다.

    참고로 스택과 힙은 메모리를 관리하는 방법이며, C++이 스택 실행 머신을 가정하고 있기 때문에 이를 따를 뿐입니다.

    • new,delete는 객체의 생명주기를 직접적으로 관리하겠다의미이므로 객체에 대해서 소멸자를 호출을 자기가 직접 해야하므로 delete를 같이 쓰는거라는거죠 ? 알 수 없는 사용자 2016.5.18 01:54
    • 네. 맞습니다. delete는 메모리 사용을 해제한다는 의미인데, 객체가 사용하는 메모리가 없어지려면, 객체가 없어져야 하겠죠? 그래서 소멸자가 호출됩니다. 허대영(소프트웨어융합대학) 2016.5.18 01:56
    • Test pTest(2,4); Test *pArray = &pTest; 이건 그런건 다 메모리 누수와 관련이 없는거죠 ? 메모리 누수라는건 동적으로 할당한 데이터들에 한하는거죠 ? 알 수 없는 사용자 2016.5.18 01:59
    • 네. :) 직접 객체를 관리할 경우에 종종 객체를 없애는 것을 깜빡해서 발생합니다. 소프트웨어가 커지면, 어디서 생성하고, 언제/어디서 없애야 할 지, 설계하는 것도 상당한 일이됩니다. 허대영(소프트웨어융합대학) 2016.5.18 02:05
    • 감사합니다 이해가 매우 잘되었습니다. ! 알 수 없는 사용자 2016.5.18 02:06

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)