로봇/C++
Declaring pointer & Dynamic Memory Allowcation
33곰탱
2025. 2. 5. 16:52
✅ C에서 동적 할당
C에서는 malloc(), calloc(), realloc(), free() 등의 함수를 사용하여 동적 메모리를 할당하고 해제함.
#include <stdio.h>#include <stdlib.h>int main() {
int *ptr = (int *)malloc(10 * sizeof(int)); // 정수 10개 크기의 메모리 할당
if (ptr == NULL) {
printf("메모리 할당 실패\\n");
return 1;
}
for (int i = 0; i < 10; i++) {
ptr[i] = i * 10;
printf("%d ", ptr[i]);
}
free(ptr); // 할당한 메모리 해제
return 0;
}
✔️ C에서 동적 할당의 특징
- malloc()은 반환값이 void *이므로, 반드시 int *처럼 형변환해야 함.
- 초기화되지 않은 메모리를 할당 (calloc()은 0으로 초기화 가능).
- free()로 메모리 해제를 해줘야 함.
✅ C++에서 동적 할당
C++에서는 new와 delete를 사용하여 동적 메모리를 할당하고 해제함.
#include <iostream>int main() {
int *ptr = new int[10]; // 정수 10개 크기의 메모리 할당
for (int i = 0; i < 10; i++) {
ptr[i] = i * 10;
std::cout << ptr[i] << " ";
}
delete[] ptr; // 배열의 경우 delete[]
return 0;
}
✔️ C++에서 동적 할당의 특징
- new 연산자는 void *가 아닌 올바른 타입을 반환하므로 형변환이 필요 없음.
- new로 할당하면 초기화되지 않음. (new int(0)처럼 초기화 가능).
- delete로 단일 객체 해제, delete[]로 배열 해제.
- malloc()과 다르게 생성자/소멸자가 호출됨.
✅ C vs C++ 동적 할당 비교
C (malloc/free) C++ (new/delete)
할당 방식 | malloc(size) | new 연산자 |
반환 타입 | void * → 형변환 필요 | 형변환 불필요 |
초기화 여부 | 초기화 안 됨 (calloc()은 0으로 초기화) | new int(0)로 초기화 가능 |
배열 할당 | (int *)malloc(N * sizeof(int)) | new int[N] |
메모리 해제 | free(ptr) | delete ptr (단일), delete[] ptr (배열) |
생성자/소멸자 | 없음 | 있음 (객체 생성 시 자동 호출) |
✅ C++에서는 std::vector를 추천
C++에서는 new/delete를 직접 사용하기보다는 std::vector 같은 컨테이너를 사용하는 것이 더 안전함.
#include <vector>#include <iostream>int main() {
std::vector<int> vec(10); // 자동으로 동적 할당됨
for (int i = 0; i < 10; i++) {
vec[i] = i * 10;
std::cout << vec[i] << " ";
}
// delete 필요 없음 (자동 관리됨)
return 0;
}
🎯 std::vector는 자동으로 메모리를 관리해 주기 때문에 new와 delete를 직접 사용할 필요가 없음
✅ std::unique_ptr란?
std::unique_ptr는 C++의 스마트 포인터(Smart Pointer) 중 하나로, new/delete를 직접 사용하지 않고도 메모리를 안전하게 관리할 수 있는 RAII(Resource Acquisition Is Initialization) 기반의 객체입니다.
즉, 동적 할당된 객체의 수명을 자동으로 관리하여 delete를 호출하지 않아도 메모리 누수를 방지할 수 있습니다.
📌 std::unique_ptr 기본 사용법
#include <iostream>
#include <memory> // 스마트 포인터를 사용하려면 포함해야 함
int main() {
std::unique_ptr<int> ptr = std::make_unique<int>(10); // 정수 10을 저장하는 unique_ptr 생성
std::cout << "값: " << *ptr << std::endl; // *ptr로 접근 가능
// ptr이 범위를 벗어나면 자동으로 메모리 해제됨 (delete 불필요)
return 0;
}
🔹 std::make_unique<int>(10) → new int(10)과 같지만, std::make_unique를 쓰는 것이 안전함!
🔹 ptr이 범위를 벗어나면 **자동으로 메모리 해제(delete)**됨.