소멸자는 객체의 수명이 끝나면 컴파일러에 의해 자동으로 호출되어 사용이 끝난 객체를 정리해준다.
소멸자의 이름은 해당 클래스의 이름과 같으며 이름 앞에 물결 표시(~)를 붙여 생성자와 구분한다.~생성자 이름();
- 소멸자의 특징
1. 소멸자는 인수를 가지지 않는다.
2. 소멸자는 반환값이 없지만 void형으로 선언하지 않는다.
3. 객체는 여러 개의 생성자를 가질 수 있지만, 소멸자는 단 하나만 가질 수 있다.
4. 소멸자는 const, volatile 또는 static으로 선언될 수는 없지만, const, volatile 또는 static으로 선언된 객체의 소멸을 위해서 호출될 수는 있다.
ㅇ
#include <iostream>
using namespace std;
class Player {
private:
int _num;
public:
Player(int num) : _num(num) {
cout << "Contructor : " << _num << endl;
}
~Player() {
cout << "Destructor : " << _num << endl;
}
};
Player player0(0);
Player* player1 = new Player(1);
void func() {
static Player player2(2);
}
int main() {
Player player3(3);
Player* player4 = new Player(4);
{
Player player5(5);
Player* player6 = new Player(6);
}
delete player4;
func();
func();
}
Contructor : 0 전역 변수 player0 생성
Contructor : 1 전역 동적 변수 player1 생성
Contructor : 3 main 함수 안의 변수 player3 생성
Contructor : 4 main 함수 안의 동적 변수 player4 생성
Contructor : 5 main 함수 블럭 안의 변수 player5 생성
Contructor : 6 main 함수 블럭 안의 동적 변수 player6 생성
Destructor : 5 블럭이 종료되며 player5 소멸
Destructor : 4 delete에 의해 player4 소멸
Contructor : 2 2번 선언하였지만 정적변수이기에 1번만 할당된 player2
Destructor : 3 main 함수가 종료되며 player3 소멸
Destructor : 2 프로그램이 종료되며 정적 변수 player2 소멸
Destructor : 0 프로그램이 종료되며 전역 변수 player0 소멸
player6은 동적 변수이기에 사용자가 따로 소멸시키지 않는 이상 소멸되지 않는다
_str을 동적 변수로 받아 소멸자로 해제를 해야한다.
#pragma warning(disable: 4996)
#include <iostream>
#include <cstring>
using namespace std;
class String {
private:
char* _str;
public:
String(const char* str) {
int len = strlen(str);
_str = new char[len];
strcpy(_str, str);
}
~String() {
delete[] _str;
}
void print() {
cout << _str << endl;
}
};
int main() {
String str("abc");
str.print();
}
abc