C++의 동적 배열 소멸자
프로그래밍 언어로 프로그래밍하는 동안 생성자와 소멸자에 대해 자주 듣습니다. 생성자는 클래스의 개체를 초기화하는 데 사용되는 특수 멤버 함수인 반면 소멸자는 개체가 소멸될 때 자동으로 호출되는 특수 함수이기도 합니다.
이 기사에서는 C++의 동적 배열에 대한 소멸자에 대해 자세히 설명합니다.
C++의 동적 배열 소멸자
소멸자는 클래스와 이름이 같고 개체가 소멸될 때 자동으로 호출되는 특수 멤버 함수입니다.
소멸자 함수는 객체가 소멸될 때 호출되는 마지막 함수입니다. 생성자가 만든 개체가 차지하는 메모리를 정리합니다.
그러나 생성자와 소멸자는 모두 클래스의 이름과 동일하지만 컴파일러가 구분할 수 있도록 작성 방법에 차이가 있습니다. 소멸자는 클래스 이름이 뒤에 오는 부정 기호(~
)와 클래스 이름만 있는 생성자를 사용하여 작성됩니다.
또한 클래스에는 소멸자가 하나만 있을 수 있지만 생성자는 여러 개일 수 있습니다.
C++에서 객체가 생성될 때마다 힙 섹션에서 메모리를 차지하며 new
키워드를 사용하여 클래스의 해당 객체를 동적으로 생성합니다. 마찬가지로 delete
키워드는 클래스의 동적으로 생성된 개체를 삭제하는 데 사용됩니다.
C++에서 소멸자의 필요성
메모리 누수를 방지하려면 개체를 삭제해야 합니다. 메모리 누수는 프로그래머가 사용하지 않는 힙의 메모리를 삭제하는 것을 잊었을 때 발생합니다. 이로 인해 사용 가능한 메모리 양이 줄어듦에 따라 컴퓨터의 성능이 저하됩니다.
또한 소멸자를 사용하여 개체를 명시적으로 삭제하지 않으면 런타임 중에 프로그램이 충돌합니다.
C++의 소멸자 예
이제 delete
연산자를 사용하여 클래스의 개체를 삭제하는 방법에 대한 몇 가지 예를 살펴보겠습니다.
예 1:
첫 번째 예에서는 new
연산자를 사용하여 클래스의 개체를 동적으로 생성하고 C++에서 delete
키워드를 사용하여 명시적으로 삭제합니다.
다음은 C++에서 delete
연산자를 사용하는 코드 예제입니다.
#include <iostream>
using namespace std;
class Employee {
public:
Employee() { cout << "Constructor of Employee class was called!\n"; }
~Employee() { cout << "Destructor of Employee class was called!\n"; }
void work() { cout << "Still Working!\n"; }
};
int main() {
Employee* emp = new Employee();
emp->work();
delete emp;
return 0;
}
출력:
Constructor of Employee class was called!
Still Working!
Destructor of Employee class was called!
위의 예에서 생성자, 소멸자 및 작업에 대한 적절한 메시지를 포함하는 work
함수가 있는 Employee
클래스를 만들었습니다.
main
함수에서 new
키워드를 사용하여 emp
클래스의 객체를 생성하고 work()
함수를 호출했습니다. 그런 다음 delete
연산자와 개체 이름 emp
를 사용하여 동일한 항목을 삭제했습니다.
C++에서 소멸자를 사용하여 동적 배열 삭제
지금까지 C++에서 delete
키워드를 사용하여 클래스의 단일 개체를 삭제하는 방법을 살펴보았습니다. 이제 C++에서 동적 배열 또는 개체 배열을 삭제하는 방법을 살펴보겠습니다.
이 예제에서는 new
키워드를 사용하여 C++에서 동적 배열을 만든 다음 delete
연산자를 사용하여 삭제합니다.
그러나 C++에서 동적 배열을 삭제할 때 기억해야 할 한 가지는 delete
연산자가 아니라 delete []
연산자를 사용해야 한다는 것입니다. 따라서 delete
연산자는 클래스의 단일 개체를 삭제하는 데 사용되는 반면 동적 배열 또는 개체 배열을 삭제하려면 C++에서 delete []
연산자를 사용해야 합니다.
이제 코드 예제를 통해 이해해 보겠습니다.
#include <iostream>
using namespace std;
class Employee {
public:
Employee() { cout << "Constructor of Employee class was called!\n"; }
~Employee() { cout << "Destructor of Employee class was called!\n"; }
void work() { cout << "Still working!\n"; }
};
int main() {
Employee* emp = new Employee[3];
emp[0].work();
emp[1].work();
emp[2].work();
delete[] emp;
return 0;
}
출력:
Constructor of Employee class was called!
Constructor of Employee class was called!
Constructor of Employee class was called!
Still working!
Still working!
Still working!
Destructor of Employee class was called!
Destructor of Employee class was called!
Destructor of Employee class was called!
이 코드 예제에는 이전 예제와 유사한 코드가 있지만 이번에는 C++에서 Employee
개체 3개를 생성하고 delete []
연산자를 사용하여 삭제했습니다.
그러나 delete []
대신 delete
연산자를 사용하면 런타임 중에 프로그램이 충돌합니다. 또한 C++에서 동적 배열 삭제를 보다 명확하게 이해하기 위해 그 예를 살펴보겠습니다.
#include <iostream>
using namespace std;
class Employee {
public:
Employee() { cout << "Constructor of Employee class was called!\n"; }
~Employee() { cout << "Destructor of Employee class was called!\n"; }
void work() { cout << "Still working!\n"; }
};
int main() {
Employee* emp = new Employee[3];
emp[0].work();
emp[1].work();
emp[2].work();
delete emp;
return 0;
}
출력:
Error in `./example1.cpp': munmap_chunk(): invalid pointer: 0x000000000117f018 ***
timeout: the monitored command dumped core
/bin/bash: line 1: 33 Aborted timeout 15s ./0f6c05b9-ee09-44c3-acee-8ad8a882ac5e < 0f6c05b9-ee09-44c3-acee-8ad8a882ac5e.in
Constructor of Employee class was called!
Constructor of Employee class was called!
Constructor of Employee class was called!
Still working!
Still working!
Still working!
Destructor of Employee class was called!
따라서 위의 출력에서 볼 수 있듯이 세 개체 모두에 대해 생성자와 work
함수가 호출되었지만 소멸자는 단일 개체에 대해 한 번만 호출되었으며 이후 프로그램이 충돌했습니다.
결론
이 기사에서는 C++의 동적 배열에 대한 소멸자에 대해 설명했습니다. 소멸자는 개체가 삭제될 때 자동으로 호출되는 특수 멤버 함수입니다.
delete
연산자를 사용하여 클래스의 개체를 삭제합니다. 그러나 클래스의 단일 개체만 삭제합니다. 동적 배열 또는 객체 배열을 삭제하려면 delete []
연산자를 사용합니다.
연산자와 그 사용법은 이 문서에서 적절한 예제와 함께 설명되었습니다.