C++에서 malloc 대 new 할당 자 사용

Jinku Hu 2023년10월12일
  1. new 연산자를 사용하여 C++에서 동적 메모리 할당
  2. new 연산자 및std::unique_ptr을 사용하여 C++에서 동적 메모리 할당
  3. malloc 함수 및realloc/reallocarray를 사용하여 동적 메모리 할당
C++에서 malloc 대 new 할당 자 사용

이 기사에서는 C++에서mallocnew 할당자를 사용하는 몇 가지 방법을 설명합니다.

new 연산자를 사용하여 C++에서 동적 메모리 할당

new는 C++에서 직접 동적 메모리를 관리하는 데 선호되는 인터페이스입니다. 주어진 유형의 객체를 생성하고 그에 대한 포인터를 반환합니다. new 연산자를 사용하여 할당 된 객체는 기본적으로 초기화됩니다. 즉, 내장 및 복합 유형 객체에는 사용 전에 초기화해야하는 가비지 값이 있습니다.

new는 다양한 요구 사항에 맞게 여러 표기법으로 호출 할 수 있지만 다음 예에서는 10크기의 int배열을 할당합니다. 따라서arr1 변수에 저장된 반환 된 포인터는40 바이트 인 메모리 청크를 가리 킵니다. initPrintIntVector 함수는 실제 코딩 예제를 더 잘 보여주기 위해서만 구현됩니다. 소위 네이 키드 포인터를 사용하고 있으므로 프로그램이 종료되기 전에delete 연산자로 할당 된 메모리를 확보하는 것이 중요합니다. 그러나delete 뒤의 대괄호는 배열의 각 위치를 할당 해제하는데도 필요합니다.

#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 NEW_SIZE = 20;
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) % 1000;
    cout << setw(2) << arr[i] << "; ";
  }
  cout << endl;
}

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

  initPrintIntVector(arr1, SIZE);

  delete[] arr1;
  return EXIT_SUCCESS;
}

출력 (* 무작위) :

 8; 380; 519; 536; 408; 666; 382; 244; 448; 165;

new 연산자 및std::unique_ptr을 사용하여 C++에서 동적 메모리 할당

new 연산자는 동적 메모리 할당을위한 훌륭한 도구 인 것처럼 보이지만, 집중적 인 메모리 조작으로 대규모 코드베이스에서 오류가 발생하기 쉽습니다. 즉, 적시에 메모리 리소스를 할당 해제하는 것은 해결하기 어려운 문제이며 대부분 메모리 누수 또는 예기치 않은 런타임 오류가 발생합니다. 이것이 표준 라이브러리에 C++ 11 버전이 가리키는 메모리를 자동으로 삭제하는 스마트 포인터가 추가 된 이유입니다. std::unique_ptr는 스마트 포인터의 한 유형으로, 자신 만 주어진 객체를 가리킬 수 있습니다. 할당은 여전히new 연산자를 사용하여 수행되며 포인터가 사용 된 후delete를 호출하지 않고 프로그램을 종료 할 수 있습니다.

#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 NEW_SIZE = 20;
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) % 1000;
    cout << setw(2) << arr[i] << "; ";
  }
  cout << endl;
}

int main() {
  std::unique_ptr<int[]> arr2(new int[SIZE]);

  initPrintIntVector(arr2.get(), SIZE);

  return EXIT_SUCCESS;
}

출력:

985; 885; 622; 899; 616; 882; 117; 121; 354; 918;

malloc 함수 및realloc/reallocarray를 사용하여 동적 메모리 할당

반면에 C++ 코드는 원래 C 스타일 할당 자 함수 인 malloc을 호출 할 수 있습니다. 이는 최신 C++ 표준에 대한 동적 메모리 조작의 매우 오래된 방법입니다. 힙에 객체를 할당하는 데 권장되는 방법은 아니지만, malloc은 더 유연한 기능을 제공합니다.

mallocsizeof 객체를 지정하는 단일 인수로 호출되며 C++에서 해당 유형으로 캐스팅되어야하는void *를 반환합니다. malloc할당 메모리의 한 가지 장점은 realloc또는 reallocarray함수로 확장 / 축소 할 수 있다는 것입니다. realloc 함수는 객체에 대한 포인터와 새 크기를 인수로 사용하는 반면reallocarray는 포인터, 요소 수 및 각 요소의 크기를 사용합니다. 개체 메모리가 확장되면 이전에 저장된 값은 그대로 유지되고 새로 추가 된 요소는 초기화되지 않습니다. 따라서 다음 예제는 데모 목적으로 만 확장 된arr3 요소를 인쇄하며 실제 프로그램에서는 그렇지 않습니다.

#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 NEW_SIZE = 20;
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) % 1000;
    cout << setw(2) << arr[i] << "; ";
  }
  cout << endl;
}

void printIntVector(int *arr, const int &size) {
  for (int i = 0; i < size; ++i) {
    cout << setw(2) << arr[i] << "; ";
  }
  cout << endl;
}

int main() {
  int *arr3 = static_cast<int *>(malloc(SIZE * sizeof(int)));
  //    int *arr3 = static_cast<int *>(malloc(SIZE * sizeof *arr3));
  //    int *arr3 = static_cast<int *>(malloc(sizeof(int[SIZE])));

  initPrintIntVector(arr3, SIZE);

  arr3 = static_cast<int *>(reallocarray(arr3, NEW_SIZE, sizeof(int)));
  // arr3 = static_cast<int *>(realloc(arr3, NEW_SIZE * sizeof(int)));
  printIntVector(arr3, NEW_SIZE);

  free(arr3);
  return EXIT_SUCCESS;
}

출력:

128; 346; 823; 134; 523; 487; 370; 584; 730; 268;
128; 346; 823; 134; 523; 487; 370; 584; 730; 268;  0;  0;  0;  0;  0;  0;  0;  0;  0;  0;
작가: 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