이번은 C++에서 char str[] 변수를 삭제할 때 delete[] str을 사용해야 하는 이유와, delete str을 사용할 경우 발생하는 문제를 정리해 본다.


delete vs delete[]의 차이

delete란?

  • delete단일 객체를 할당 해제할 때 사용.
  • new 연산자로 단일 객체를 할당한 경우 delete를 사용하여 해제한다.
int* ptr = new int(10);
delete ptr; // 올바른 사용

delete[]란?

  • delete[]배열을 할당 해제할 때 사용해야 한다.
  • new[] 연산자로 배열을 할당한 경우 반드시 delete[]를 사용하여 해제해야한다.
int* arr = new int[5];
delete[] arr; // 올바른 사용

char str[]의 경우

올바른 동적 할당 및 해제

char* str = new char[10];
delete[] str; // 올바른 방식

잘못된 해제 방식

char* str = new char[10];
delete str; // 정의되지 않은 동작(UB, Undefined Behavior)

delete str;은 잘못된 것일까?

  1. delete첫 번째 요소만 해제하므로, 나머지 메모리는 해제되지 않은 상태가 된다.
  2. C++에서는 객체가 동적으로 생성될 경우, 소멸자를 올바르게 호출해야 하는데 delete는 배열의 모든 요소에 대한 소멸자를 호출하지 않는다.
  3. 결과적으로 메모리 누수(memory leak) 또는 정의되지 않은 동작(UB, Undefined Behavior)이 발생할 수 있다.

예제 (올바른 사용법)

#include <iostream>

int main() {
    // 문자열 동적 할당
    char* str = new char[20];
    strcpy(str, "Hello, World!");
    
    std::cout << str << std::endl;
    
    // 올바른 해제
    delete[] str;
    
    return 0;
}

결론

  • delete는 단일 객체를 해제할 때 사용.
  • delete[]는 동적 배열을 해제할 때 사용.
  • new[]로 할당한 메모리를 delete로 해제하면 정의되지 않은 동작(UB)이 발생할 수 있다.
  • 따라서 항상 new[] delete[]를 함께 사용해야 한다.

이 점을 주의하며 C++ 코드를 작성하면 메모리 관리 문제를 방지할 수 있다.

태그:

카테고리:

업데이트:

댓글남기기