C++에서 std::vector 개체 할당 해제

Hafiz Muhammad Zohaib 2023년10월12일
C++에서 std::vector 개체 할당 해제

이 기사에서는 C++/C에서 std::vector 개체의 할당을 해제하는 방법을 설명합니다. 먼저 자체 코딩된 할당 해제 방법을 살펴본 다음 std::vector 객체가 C++에서 어떻게 동적으로 할당 해제되는지 살펴보겠습니다.

C++에서 객체 할당 해제

C++에서 클래스 개체가 생성되면 생성자라는 특수 멤버 함수가 자동으로 호출되어 일부 기본값으로 개체를 초기화합니다. 마찬가지로 생성된 개체가 범위를 벗어나면 특수 멤버 함수 destructor가 자동으로 호출됩니다.

소멸자 기능은 생성된 개체가 차지하는 모든 메모리를 해제합니다. 개체가 차지하는 메모리를 해제하는 이 프로세스를 할당 해제라고 합니다.

std::vector 객체

C++에서 std는 네임스페이스이고 :: 연산자는 범위 연산자입니다. 이 범위 연산자는 식별자/클래스를 찾을 클래스/네임스페이스를 컴파일러에 알려줍니다.

표현식이 std::cout과 같은 경우 std 네임스페이스에서 cout 식별자를 찾는 것을 의미합니다. 마찬가지로 std::vectorstd 네임스페이스에서 벡터 클래스를 찾는 것을 의미합니다.

할당 해제를 위해 먼저 vector 클래스의 개체를 만들어야 합니다. 이를 위해 GCC 컴파일러 C++11과 함께 아래 코드를 사용할 수 있습니다.

#include <iostream>
#include <vector>

int main() {
  // Create a vector containing integers
  std::vector<int> v = {7, 5, 16, 8};
}

std 네임스페이스에는 위 코드의 여러 C++ 라이브러리가 포함되어 있습니다. 먼저 명시적으로 vector 라이브러리를 추가하고 이를 사용하여 std::vector<int> 유형으로 벡터를 초기화했습니다.

C++에서 자체 코딩된 벡터 할당 해제 방식

아래 코드에서 벡터를 삭제하는 명령을 명시적으로 작성했습니다. 이는 new 키워드를 사용하여 벡터를 생성하는 경우에만 적용됩니다.

new 연산자는 Free Store에서 메모리 할당에 대한 조회 신호를 보냅니다. new 연산자는 충분한 공간이 있는 경우 메모리를 할당하고 초기화한 다음 새로 생성되고 초기화된 메모리의 위치를 포인터 변수에 제공합니다.

아래 코드에서는 먼저 벡터 포인터를 초기화한 다음 NULL인지 여부를 확인했습니다. 필요한 계산을 수행한 후 assert 문을 통해 벡터 포인터가 비어 있지 않음을 확인했습니다.

그런 다음 delete 문을 사용하여 벡터와 점유 공간을 제거했습니다.

#include <cassert>
#include <iostream>
#include <vector>
using namespace std;

int main() {
  std::vector<int>* vec = new std::vector<int>;
  \\*** assert(vec != NULL);
  delete vec;
  return 0;
}

아래 코드를 사용하여 필요한 계산을 수행한 후 빈 벡터를 할당하여 vec에 의해 할당된 메모리를 해제했습니다. std::vector<int>() 명령은 0바이트의 빈 벡터를 생성합니다.

마지막 명령문은 vec가 차지하는 메모리를 바이트 단위로 확인합니다.

std::vector<int> vec;
\\***
\\*** vec = std::vector<int>();
std::cout << sizeof(decltype(vec.back())) * vec.capacity() << std::endl;

C++에서 벡터 할당 해제의 동적 방법

C++에서 함수 내부(즉, {....} 내부)에서 std::vector 개체를 정의하면 벡터 클래스 생성자가 자동으로 호출되어 벡터 개체를 초기화합니다. 함수 실행이 끝나면(즉, 닫는 괄호 }에 도달하면) 소멸자가 자동으로 호출됩니다.

예를 들어,

void Foo() {
  std::vector<int> v;
  ...
}

C++는 메서드가 실행될 때 v의 소멸자가 호출되도록 보장합니다. std::vector의 소멸자는 할당된 메모리가 해제되도록 합니다.

관련 문장 - C++ Vector