C++에서 malloc 대 new 할당 자 사용
-
new
연산자를 사용하여 C++에서 동적 메모리 할당 -
new
연산자 및std::unique_ptr
을 사용하여 C++에서 동적 메모리 할당 -
malloc
함수 및realloc
/reallocarray
를 사용하여 동적 메모리 할당
이 기사에서는 C++에서malloc
과new
할당자를 사용하는 몇 가지 방법을 설명합니다.
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
은 더 유연한 기능을 제공합니다.
malloc
은sizeof
객체를 지정하는 단일 인수로 호출되며 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;
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