C++) 배열 해제
이번은 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;
은 잘못된 것일까?
delete
는 첫 번째 요소만 해제하므로, 나머지 메모리는 해제되지 않은 상태가 된다.- C++에서는 객체가 동적으로 생성될 경우, 소멸자를 올바르게 호출해야 하는데
delete
는 배열의 모든 요소에 대한 소멸자를 호출하지 않는다. - 결과적으로 메모리 누수(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++ 코드를 작성하면 메모리 관리 문제를 방지할 수 있다.
댓글남기기