본문 바로가기
프로그래밍 언어/C++

[C++] 소멸자 함수

by 까망 하르방 2025. 4. 25.
반응형

소멸자

클래스 이름과 동일한 이름의 멤버함수로

함수명 앞에 「~」 붙여 생성자함수 이름과 구별

#include <iostream>

using namespace std;

class A
{
    int no;
public:
    A() {}
    ~A(); // 마무리 할 작업이 없으면 굳이 명시할 필요는 없음
};

A::~A()
{
    cout << "소멸자..." << endl;
}

int main(void)
{
    A aa;
    cout << "end main..........." << endl;
}



특징

• return type 명시할 수 없다.
• 자동으로 호출되는 멤버함수로 인수 전달 받지 않는 형식
• 체가 메모리에서 제거되기 전 마지막으로 호출되는 함수로
 주로 마무리 작업 용도
• delete 키워드 동일한 역할
•  friend, static, const로 둘 수 없다.


RAII(Resource Acquisition Is Initialization)

Bjarne Stroustrup의 “자원의 획득은 초기화이다”라는 말로
자원(resource)의 소멸(해제)은  소멸자에서 처리 하라는 말과 일맥 상통

개체가 선언된 범위(scope)를 벗어날 때
소멸자 호출하여 생명 주기(life time)에 맞추어 자원 해제

 

 

[예제 코드]
file open/close 구현하는 것에 있어서
아래와 같은 형식으로 주로 구현한다.

#include <stdio.h>

int main(void)
{
    FILE* fp;
    char buf[133];

    fopen_s(&fp, "source.cpp", "r");

    while (fgets(buf, 133, fp))
    {
        // 한 라인씩 읽으며 true or null 반환
        printf("%s", buf);
    }

    fclose(fp);
}



생성자/소멸자 활용

#include <stdio.h>

class MFile
{
    FILE * m_fp;
    char m_buf[133];

public:
    MFile() {}
    MFile(const char * fname, const char *mode = "r");
    ~MFile();

    void Print(void);
    char * GetBuffer(void);
    char * Read(void);
};

void MFile::Print(void)
{
    int line = 1;
    while (Read())
    {
        printf("[%03d] %s", line++, GetBuffer());
    }
}

char * MFile::GetBuffer(void)
{
    return m_buf;
}

char * MFile::Read(void)
{
    return ::fgets(m_buf, 133, m_fp);
}

MFile::MFile(const char * fname, const char *mode)
{
    ::fopen_s(&m_fp, fname, mode);
}

MFile::~MFile()
{
    ::fclose(m_fp);
}

int main(void)
{
    MFile gm("harbang.cpp", "r");
    gm.Print();
}

 

반응형

'프로그래밍 언어 > C++' 카테고리의 다른 글

[C++] 임시(temporary) 객체  (13) 2025.04.26
[C/C++] 메모리 영역(스택, 힙, 데이터 영역)  (5) 2025.04.20
[C/C++] 비트 필드 구조체  (8) 2025.03.23
[C++] noexcept  (3) 2025.03.20
[C++] RAII & stack unwinding  (1) 2025.03.19

댓글