C++의 벡터 소멸자

Naila Saad Siddiqui 2023년10월12일
  1. C++의 소멸자
  2. C++에서 벡터와 문자열의 소멸자
C++의 벡터 소멸자

이 문서에서는 C++에서 벡터와 문자열을 만들 때 소멸자와 소멸자를 사용하는 방법에 대해 설명합니다.

C++의 소멸자

OOP 패러다임에서 소멸자는 클래스의 객체가 삭제되거나 수명이 끝날 때마다 자동으로 실행되는 각 클래스와 관련된 멤버 함수입니다. 또한 힙 메모리에 생성된 모든 변수에 대해 소멸자가 호출됩니다.

이러한 변수가 삭제되면 나중에 사용할 수 있도록 메모리가 해제되도록 소멸자가 호출됩니다.

소멸자는 타일 기호 접두사(~)가 있는 클래스 이름과 동일한 이름으로 생성됩니다. 클래스에서 생성자를 사용하여 생성된 모든 객체는 소멸자를 사용하여 삭제되지만 생성 순서의 역순으로 삭제됩니다.

소멸자의 구문은 다음과 같습니다.

~<className>() {
  // coding
}

예시 클래스를 살펴보겠습니다.

#include <iostream>
using namespace std;

class DestructorExample {
 public:
  DestructorExample() { cout << "In Constructor of DestructorExample" << endl; }

  ~DestructorExample() { cout << "In Destructor of DestructorExample"; }
};
int main() {
  DestructorExample t;
  return 0;
}

그러면 다음과 같은 결과가 나타납니다.

In Constructor of DestructorExample
In Destructor of DestructorExample

C++에서 벡터와 문자열의 소멸자

std::vectorstd::string을 사용하는 경우 개체가 범위를 벗어나면 소멸자가 자동으로 호출됩니다. 이러한 클래스에는 해당 객체를 삭제해야 할 때 자동으로 트리거되는 소멸자가 구현되어 있습니다.

따라서 이를 호출하거나 명시적으로 구현할 필요가 없습니다.

그러나 일부 클래스에 대한 포인터 벡터가 있는 경우 이러한 객체를 다음과 같이 명시적으로 삭제해야 합니다.

#include <iostream>
#include <vector>

using namespace std;

class MyClass {
 public:
  MyClass() { cout << "Object Created" << endl; }

  ~MyClass() { cout << "Object Destroyed" << endl; }
};

int main() {
  vector<MyClass*> testVec;
  // Creating the objects
  MyClass* p = NULL;
  for (int i = 0; i < 3; i++) {
    p = new MyClass();
    testVec.push_back(p);
  }
  // Destroying the objects
  for (auto p : testVec) {
    delete p;
  }
  testVec.clear();

  return 0;
}

출력:

Object Created
Object Created
Object Created
Object Destroyed
Object Destroyed
Object Destroyed

벡터를 반복하고 각 개체를 명시적으로 삭제합니다. 힙의 메모리가 해제되었습니다. 따라서 .clear() 메서드를 사용하여 벡터의 모든 요소를 제거할 수 있습니다.

이제 MyClass* 개체를 명시적으로 삭제해야 합니다. 벡터는 이러한 개체를 삭제하지 않습니다. 따라서 벡터에 간단한 클래스 개체가 있으면 해당 개체가 자동으로 삭제된다고 말할 수 있습니다.

그러나 포인터가 있는 경우 명시적으로 삭제해야 합니다.

관련 문장 - C++ Destructor