C++에서 삭제 연산자 사용

Jinku Hu 2023년10월12일
  1. delete연산자를 사용하여 개체에 할당 된 리소스 해제
  2. delete연산자를 사용하여 벡터의 요소 해제
C++에서 삭제 연산자 사용

이 기사에서는 C++에서delete연산자를 사용하는 방법에 대한 몇 가지 방법을 설명합니다.

delete연산자를 사용하여 개체에 할당 된 리소스 해제

new연산자를 사용하여 동적으로 할당 된 오브젝트는 프로그램 종료 전에 해제되어야합니다. 이는 호출자가delete조작을 명시 적으로 호출해야 함을 의미합니다. 생성자 이니셜 라이저는new연산자로 객체를 선언하고 초기화하는 데 사용할 수 있습니다. 다음 예제 코드는 이러한 시나리오를 보여준 다음main함수에서 반환하기 전에 해당 리소스를 해제합니다. 힙 개체에 대해delete연산자를 호출하지 않으면 메모리 누수가 발생하여 장기 실행 프로세스에 막대한 메모리 사용량이 발생합니다.

#include <cstdlib>
#include <iomanip>
#include <iostream>
#include <random>
#include <vector>

using std::cout;
using std::endl;
using std::setw;
using std::string;
using std::vector;

int main() {
  int *num = new int(1024);
  auto *sp = new string(10, 'a');

  cout << *num << endl;
  cout << *sp << endl;

  for (const auto &item : *vp) {
    cout << item << ", ";
  }
  cout << endl;

  delete num;
  delete sp;

  return EXIT_SUCCESS;
}

출력:

1024
aaaaaaaaaa

newdelete 연산자는 표준 라이브러리 컨테이너에서도 사용할 수 있습니다. 즉,std::vector 객체는 다음 예제 코드에서 단일 문으로 할당되고 초기화됩니다. new 연산자가vector에 대한 포인터를 반환하면 일반vector 객체와 마찬가지로 연산을 수행 할 수 있습니다.

#include <cstdlib>
#include <iomanip>
#include <iostream>
#include <random>
#include <vector>

using std::cout;
using std::endl;
using std::setw;
using std::vector;

int main() {
  auto *vp = new vector<int>{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

  for (const auto &item : *vp) {
    cout << item << ", ";
  }
  cout << endl;

  delete vp;

  return EXIT_SUCCESS;
}

출력:

0, 1, 2, 3, 4, 5, 6, 7, 8, 9,

delete연산자를 사용하여 벡터의 요소 해제

동적으로 할당 된 배열에delete연산자를 사용하는 것은 약간 다릅니다. 일반적으로newdelete는 객체에서 한 번에 하나씩 작동하지만 배열에는 한 번의 호출로 할당되는 여러 요소가 필요합니다. 따라서 다음 예제 코드에 설명 된대로 대괄호 표기법을 사용하여 배열의 요소 수를 지정합니다. 이와 같은 할당은 다른 멤버에 액세스하기 위해 역 참조 할 수있는 첫 번째 요소에 대한 포인터를 반환합니다. 마지막으로, 배열이 필요하지 않은 경우 빈 대괄호를 포함하는 특수delete표기법으로 해제해야합니다. 이는 모든 요소가 할당 해제되었음을 보장합니다.

#include <cstdlib>
#include <iomanip>
#include <iostream>
#include <random>
#include <vector>

using std::cout;
using std::endl;
using std::setw;
using std::vector;

constexpr int SIZE = 10;
constexpr int MIN = 1;
constexpr int MAX = 1000;

void initPrintIntVector(int *arr, const int &size) {
  std::random_device rd;
  std::default_random_engine eng(rd());
  std::uniform_int_distribution<int> distr(MIN, MAX);

  for (int i = 0; i < size; ++i) {
    arr[i] = distr(eng) % MAX;
    cout << setw(3) << arr[i] << "; ";
  }
  cout << endl;
}

int main() {
  int *arr1 = new int[SIZE];

  initPrintIntVector(arr1, SIZE);

  delete[] arr1;
  return EXIT_SUCCESS;
}

출력:

311; 468; 678; 688; 468; 214; 487; 619; 464; 734;
266; 320; 571; 231; 195; 873; 645; 981; 261; 243;
작가: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

관련 문장 - C++ Memory