Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++에서 delete와 free()의 차이점 및 올바른 사용법

C++ 프로그램에서 더 이상 사용하지 않는 메모리를 해제하는 대표적인 방법은 delete 연산자free() 함수입니다. 이번 튜토리얼에서는 두 가지의 역할과 올바른 사용법을 예제 코드를 통해 살펴보겠습니다.

delete와 free(), 어떤 차이가 있을까?

두 기능의 핵심 목적은 같습니다. 바로 사용이 끝난 메모리를 시스템에 반납하는 것입니다. 다만 어떤 방식으로 메모리를 할당했는지에 따라 짝이 정해집니다.

  • delete 연산자: new로 할당한 메모리를 해제할 때 사용
  • free() 함수: malloc()으로 할당한 메모리를 해제할 때 사용

즉, new ↔ delete, malloc ↔ free처럼 할당과 해제의 쌍을 반드시 맞춰야 하며, 이를 혼용하면 정의되지 않은 동작(undefined behavior)이 발생할 수 있습니다. 또한 delete는 객체의 소멸자를 호출하지만 free()는 그렇지 않다는 점도 중요한 차이입니다.

예제 코드

#include<stdio.h>
#include<stdlib.h>
int main(){
    int x;
    int *ptr1 = &x;
    int *ptr2 = (int *)malloc(sizeof(int));
    int *ptr3 = new int;
    int *ptr4 = NULL;
    //잘못된 delete 사용
    delete ptr1;
    delete ptr2;
    //올바른 delete 사용
    delete ptr3;
    delete ptr4;
    getchar();
    return 0;
}

코드 설명

  • ptr1: 스택 변수 x의 주소를 가리키므로 delete로 해제하면 안 됩니다.
  • ptr2: malloc()으로 할당했기 때문에 free(ptr2)로 해제해야 하며, delete를 사용하면 오류가 발생합니다.
  • ptr3: new로 할당했으므로 delete로 해제하는 것이 올바른 사용법입니다.
  • ptr4: NULL 포인터에 대한 delete 호출은 안전하며, 아무 작업도 수행하지 않습니다.

정리

메모리 해제는 반드시 할당 방식과 짝을 이루어야 합니다. new로 할당했다면 delete로, malloc()으로 할당했다면 free()로 해제하는 습관을 들이면 메모리 누수와 런타임 오류를 효과적으로 예방할 수 있습니다.