갓똥
나는야 프로그래머
갓똥
전체 방문자
오늘
어제
  • 분류 전체보기 (186)
    • 프로그래밍 (146)
      • 자바 (9)
      • 안드로이드 (2)
      • 유니티 (20)
      • C++ (38)
      • C# (56)
      • HTML (2)
      • 파이썬 (3)
      • 자료구조 (2)
      • 알고리즘 (0)
      • 문제풀이 (4)
      • 디자인 패턴 (7)
      • 카카오톡 봇 (1)
      • 엑셀 (1)
      • 기타 (1)
    • 게임 (21)
      • 테일즈위버 (0)
      • 카이로소프트 (1)
      • 순위 (19)
      • 기타 (1)
    • 일상 (13)
      • 카페 (1)
      • 방탈출 (12)
    • 기타 (6)
      • 웃긴자료 (5)

블로그 메뉴

  • 홈
  • 방명록

공지사항

인기 글

태그

  • 롤 골드그래프
  • 전세계게임매출순위
  • 자바
  • 2020년 게임 매출
  • 글로벌게임매출
  • 강남 방탈출
  • c# delegate
  • C# 예외 처리
  • c# Thread
  • 게임 디자인 패턴
  • c# 코루틴
  • Unity Graph
  • C# boxing
  • pc게임 순위
  • C++ 상속
  • c# collection
  • C++ virtual
  • 알고리즘
  • C++
  • 게임매출순위
  • 모바일 게임 순위
  • 유니티 골드그래프
  • C++ 소멸자
  • c# unboxing
  • 유니티 그래프 그리기
  • pc 게임 순위
  • 유니티 그래프
  • c# coroutine
  • 전세계 게임 매출
  • 게임 매출 순위

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
갓똥
프로그래밍/C++

[C++] 소멸자 (destructor)

[C++] 소멸자 (destructor)
프로그래밍/C++

[C++] 소멸자 (destructor)

2019. 11. 4. 23:31
728x90
반응형

1. 소멸자 개념

#include <iostream>

class Point {
    int x, y;
public:
    Point()  { std::cout << "Point()"  << std::endl; }  // 생성자
    ~Point() { std::cout << "~Point()" << std::endl; }  // 소멸자
};

int main() {
    Point pt;
}

  ① 소멸자 모양

    => ~클래스이름()

    => 리턴 타입을 표기하지 않는다.

    => 인자를 가질 수 없다. - 한 개만 만들 수 있다.

 

  ② 특징

    => 객체를 생성 하면 생성자가 호출되고

    => 객체가 파괴 되면 소멸자가 호출된다.

 

  ③ 소멸자를 만들지 않으면

    => 컴파일러가 아무 일도 하지 않는 소멸자를 제공해 준다.

 

  ④ 소멸자가 필요한 경우

    => 생성자 등에서 자원을 할당한 경우, 소멸자에서 자원을 해지 해야 한다.

    => 자원 해지 등이 필요 없는 경우는 소멸자를 만들 필요는 없다.

 


2. 소멸자 사용 예제

#include <stdio.h>

int main() {
    FILE* f = fopen("a.txt", "wt");
    
    // f = 0; - 변수에 접근할 수 있어 실수할 수 있다.
    
    fputs("hello", f);
    
    fclose(f);
}

 

위와 같은 C언어로 짠 코드가 있다고 해보자.
위의 코드의 단점은 사용자가 쓸 파일을 열고 꼭 닫아주어야 한다는 것이다.
또, 파일의 정보를 들고 있는 f에 접근이 가능하여 실수할 경우 f가 날라갈 수도 있다.

  ① C 스타일 코드의 단점

    => 획득한 자원은 반드시 사용자가 직접 반납해야 한다.

    => 자원의 핸들을 담은 변수에 직접 접근 할 수 있다.

 

  ② 자원 할당과 자원 해지가 필요한 코드

    => C++을 사용해서 생성자에서 자원을 할당하고 소멸자에서 자원을 해지하면 자동으로 자원이 관리된다.

    => RAII (Resource Acquision Is Initialization)

 

#include <iostream>
#include <cstdio>
#include <string>

int main() {
    FILE* f = fopen("a.txt", "wt");
    
    f = 0; // 변수에 실수로 값을 넣었을 때
    
    fputs("hello", f);
    
    fclose(f);
}

 

위의 코드를 C++로 바꾼 코드이다. 이제 Class를 이용해서 C 스타일 코드의 단점을 없애보자.

 

#include <iostream>
#include <cstdio>
#include <string>

class File {
    FILE* file = 0; // C++11부터 바로 초기화 가능
public:
    File(std::string filename, std::string mode) {
        file = fopen(filename.c_str(), mode.c_str()); 
    }
    ~File() {
        fclose(file);
    }
    void puts(std::string s) {
        fputs(s.c_str(), file);
    }
};

int main() {
    File f("a.txt", "wt");
    
    f.puts("hello");
    
    /*
    FILE* f = fopen("a.txt", "wt");
    f = 0; - 접근 불가
    fputs("hello", f);
    fclose(f);
    */
}

  ① C++에서 가장 널리 사용되는 코딩 스타일

    => 생성자에서 자원을 할당한다.

    => 소멸자에서 자원을 반납한다.

    => 자원의 번호를 담은 멤버 변수는 private 영역에 놓고 외부에서 직접 접근할 수 없게 한다

728x90
반응형

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

[C++] explicit 생성자  (0) 2019.11.06
[C++] 초기화 리스트 (member initializer list)  (4) 2019.11.05
[C++] 생성자 (constructor)  (0) 2019.10.31
[C++] 접근지정자  (0) 2019.10.29
[C++] 객체지향 프로그래밍의 개념(2)  (0) 2019.10.29
  • 1. 소멸자 개념
  • 2. 소멸자 사용 예제
'프로그래밍/C++' 카테고리의 다른 글
  • [C++] explicit 생성자
  • [C++] 초기화 리스트 (member initializer list)
  • [C++] 생성자 (constructor)
  • [C++] 접근지정자
갓똥
갓똥
공부하며 알아가는 내용을 정리해 봅니다.

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.