[Modern C++] 4.3. 복사 생성자와 소멸자

윤정민·2023년 6월 30일
0

C++

목록 보기
11/46

1. 소멸자

new로 생성해준 것을 delete로 할당 해제 해주는 것과 마찬가지로 메모리 누수(Memory Leak)을 방지하기 위해 소멸자를 호출한다.

  • 소멸자 내용에는 delete해야 되는 것들을 작성
  • 소멸자는 객체가 포함된 scope가 닫힐 때 자동으로 호출
  • 소멸자 사용법
    ~클래스명();

2. 복사 생성자(Copy Constructor)

2.1. 기본 복사 생성자

컴파일러는 기본적으로 복사 생성자를 자동으로 생성해준다. 하지만 자동으로 생성된 복사 생성자는 얕은 복사(shallow copy)밖에 하지 못하므로, 다음과 같은 문제가 생긴다.

Marine::Marine(const Marine& m) {
    this.name = m.name; // shallow copy
}
  • name이 같은 주소를 가리키도록 만들면, 한 객체에서 소멸된 호출되어 name의 메모리 공간이 해제된 후, 다른 객체에서 소멸자가 호출됨
    • 해제된 메모리 공간을 다시 해제하려 하기 때문에 런타임 오류가 발생
    • 복사 생성자를 호출할 때는 동적 할당이 되는 변수가 있다면 깊은 복사를 수행해야 함

2.2. 커스텀 복사 생성자

주소 값이 아닌 진짜 변수값을 복사하여 문제 해결

Marine::Marine(const Marine& m) {
    char* name = new char[strlen(m.name) + 1];
    strcpy(name, m.name);
}
profile
그냥 하자

0개의 댓글