객체 내부의 함수에서 exit()함수를 이용해 프로그램을 종료하니 소멸자가 호출되지 않았습니다. 소멸자를 호출하면서 프로그램을 종료시킬 방법이 있나요?

조회수 2988회

안녕하세요 대학교에서 프로그래밍을 배우고 있는 학생입니다.

지난번에 팀단위 프로젝트를 진행하면서 발생했던 오류인데요, 프로젝트는 끝났지만 나중에도 문제가 될 수 있을거 같아 질문 올립니다.

일단 당시 프로젝트에 사용했던 코드는 너무 길어서 제가 비슷한 그리고 같은 오류가 발생하는 코드를 작성했습니다.

#include<iostream>
#include<stdlib.h>

using namespace std;
class testclass{
private:
public:
private:
public:
    testclass()
    {
        cout<<"hello"<<endl;
    }
    ~testclass()
    {
        cout<<"byebye"<<endl;
    }
    void exitcall(int input)
    {
        if(input)
        {
            exit(0);
        }
    }
};

int main()
{
    testclass a;
    int input;
    cin>>input;
    a.exitcall(input);
    return 0;
} 

제 코딩 습관 때문에 코드가 괜히 길어졌지만, 프로그램 자체는 매우 간단합니다.

main에서 a라는 이름의 testclass객체를 생성하고, 사용자로부터 숫자를 입력받습니다.

만약 숫자가 0이면, main에 위치한 return을 통해 프로그램을 종료하고,

입력받은 숫자가 0이 아니면, testclass의 exitcall()함수 안에서 exit()함수를 이용해 프로그램을 종료합니다.

이때 생성자와 소멸자가 실행되는지 보기 위해 생성자가 실행되면 "hello"를 출력하고

소멸자가 실행되면 "byebye"를 출력합니다.

그리고 다음이 실행화면입니다.이미지

보시면, 0을 입력했을때(즉, main에서 return을 통해 프로그램이 종료됐을때)에는 소멸자가 호출되면서 "byebye"가 화면에 출력되었지만,

1을 입력했을때(즉, 객체 내부에서 exit()을 통해 프로그램이 종료됐을때)에는 소멸자가 호출되지 않고 프로그램이 종료되었습니다.

다른 코드로 실험해보니 exit()함수로 프로그램을 종료시키면 소멸자가 호출되지 않는것 같은데, 객체 내부에서 객체의 소멸자를 호출하고 프로그램을 종료시킬 방법이 있나요?

추가로, 저는 ubuntu 14.04.5 LTS환경에서 g++을 이용해 컴파일 했습니다.

그리고 프로젝트를 진행할 당시에는 ROS라이브러리를 사용하고 있어서 exit()대신에 ros::shutdown함수를 이용해 프로그램을 종료시켜서 문제를 해결했었습니다. 다만 ROS가 모든 환경에서 쉽게 쓸 수 있는게 아니라 ROS를 사용하지 않고 해결할 방법이 궁금해서 질문 올렸습니다.

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

1 답변

  • 우선 소멸자는 객체가 정리될 때 호출됩니다. 정리되는 시점이란 객체 a는 함수 호출이 끝나 스택이 정리될 때 그리고 힙에 객체를 만들고 delete 를 호출할 때 입니다.

    그러나 exit 함수는 스택을 정리하지 않습니다.

    스택을 정리하지 않으니 스택에 생성된 a객체를 제거하지 않고 그로인해 소멸자도 호출되지 않습니다.

    객체 내부에서 객체의 소멸자를 호출하고 프로그램을 종료시킬 방법이 있나요?
    => 그걸 소멸자로 할 필요가 있나요? 그냥 펑션하나 호출하고 종료시키면 되지 않을까요?
    
    
        void aMethod()
        {
            cout<<"byebye"<<endl;
        }
    
        void exitcall(int input)
        {
            if(input)
            {
                aMethod();
                exit(0);
            }
        }
    

    프로그램 디자인을 다시해보세요.

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

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

(ಠ_ಠ)
(ಠ‿ಠ)