로봇/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에서 동적 할당의 특징

  1. malloc()은 반환값이 void *이므로, 반드시 int *처럼 형변환해야 함.
  2. 초기화되지 않은 메모리를 할당 (calloc()은 0으로 초기화 가능).
  3. 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++에서 동적 할당의 특징

  1. new 연산자는 void *가 아닌 올바른 타입을 반환하므로 형변환이 필요 없음.
  2. new로 할당하면 초기화되지 않음. (new int(0)처럼 초기화 가능).
  3. delete로 단일 객체 해제, delete[]로 배열 해제.
  4. 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)**됨.