new 및 delete 연산자
C++ 언어의 new 및 delete 연산자를 사용하면 할당을 제어할 수 있습니다.
learn.microsoft.com
마소의 new, delete 연산자에 대한 학습을 하다가 생긴 의문을 정리했다.
[목차]
1. Operator new
개요:
- C++에서 동적 메모리 할당을 위해 사용하는 연산자입니다.
- 객체를 생성할 때 호출되며, **생성자(Constructor)**도 자동으로 호출합니다.
특징:
- new 키워드를 사용하여 호출됩니다.
- 메모리를 할당하고, 할당된 메모리 주소를 반환합니다.
- 기본적으로 operator new는 메모리 할당에 실패하면 std::bad_alloc 예외를 던집니다.
사용 예제:
int* ptr = new int(42); // 정수형 메모리를 할당하고, 42로 초기화
std::cout << *ptr << std::endl; // 출력: 42
delete ptr; // 메모리 해제
커스터 마이징:
operator new를 오버로딩하여 메모리 할당 동작을 변경할 수 있습니다.
void* operator new(size_t size) {
std::cout << "Custom new operator called for size: " << size << std::endl;
return malloc(size); // 내부적으로 malloc을 호출
}
2. malloc
개요:
- C언어에서 제공하는 메모리 할당 함수이며, C++에서도 사용할 수 있습니다.
- 힙(heap) 메모리에서 지정된 크기만큼 할당하며, 반환값은 void*입니다.
특징:
- 초기화하지 않음: 할당된 메모리는 초기화되지 않습니다.
- 할당된 메모리는 반드시 **free**를 사용하여 해제해야 합니다.
- C++ 객체를 생성할 때는 생성자가 호출되지 않음.
사용 예시:
int* ptr = (int*)malloc(sizeof(int));
*ptr = 42; // 메모리 초기화
std::cout << *ptr << std::endl; // 출력: 42
free(ptr); // 메모리 해제
차이점 (vs operator new):
- malloc은 예외를 던지지 않고, 실패 시 NULL을 반환합니다.
- 객체 생성 및 소멸자의 호출이 없습니다.
3. memset
개요:
- C언어에서 제공하는 함수로, 메모리를 특정 값으로 초기화하는 데 사용됩니다.
- C++에서도 사용 가능하며, 주로 초기화나 클리어 목적으로 사용됩니다.
특징:
- 메모리의 모든 바이트를 지정된 값으로 설정합니다.
- 초기화 값은 바이트 단위로 설정되므로, 0으로 초기화할 때 주로 사용됩니다.
사용 예시:
#include <cstring> // memset 사용을 위해 필요
int arr[5];
memset(arr, 0, sizeof(arr)); // 배열을 0으로 초기화
for (int i = 0; i < 5; ++i) {
std::cout << arr[i] << " "; // 출력: 0 0 0 0 0
}
주의점:
- 객체 초기화에는 적합하지 않으며, POD (Plain Old Data) 타입에서만 안전하게 사용할 수 있습니다.
요약 비교:
특성 | operator new | malloc | memset |
용도 | 동적 메모리 할당 + 생성자 호출 | 동적 메모리 할당 | 메모리 초기화 |
초기화 여부 | 가능 (생성자 호출) | 불가능 | 특정 값으로 초기화 |
해제 방식 | delete | free | 해제 불필요 |
예외 처리 | std::bad_alloc 예외 발생 | 실패 시 NULL 반환 | 없음 |
객체 지원 | O | X | X |
각 메모리 관리 방식은 상황에 따라 적합하게 선택해 사용해야 합니다. C++에서는 new/delete를 주로 사용하며, malloc과 memset은 저수준 메모리 작업이나 특정 요구사항이 있을 때 활용됩니다.
'프로그래밍 > C++' 카테고리의 다른 글
[C++] constexpr에 대해서 (0) | 2024.12.27 |
---|---|
[C++] static에 대해서 (0) | 2024.12.27 |