2026년 상식닷컴 선정 식당 & 카페 리스트
최근에 오픈한 호텔을 찾는다면 살펴보세요

C++에서 delete와 delete[]의 차이는?

_____
질문: C++에서 `delete`와 `delete[]`의 차이는 무엇인가요?

답변:

1. 기본 개념 차이
- `delete`는 단일 객체를 위한 메모리 해제 연산자입니다.
- `delete[]`는 배열 형태로 할당된 객체들의 메모리를 해제하는 연산자입니다.

2. 언제 사용해야 하나요?
- `new`로 단일 객체를 할당했으면, 반드시 `delete`로 해제해야 합니다.
```cpp
int* p = new int;
delete p; // 올바름
```
- `new[]`로 배열을 할당했으면, 반드시 `delete[]`로 해제해야 합니다.
```cpp
int* arr = new int[10];
delete[] arr; // 올바름
```

3. 차이점의 내부 동작
- 단일 객체에 대해 `delete`를 호출하면 해당 객체의 소멸자가 한 번 호출되고, 메모리가 해제됩니다.
- `delete[]`는 배열 크기를 기억하고 있어, 배열에 포함된 모든 요소 각각의 소멸자가 순서대로 호출된 후 메모리를 해제합니다.
(배열 크기는 컴파일러가 내부적으로 관리합니다.)

4. 만약 잘못 사용하면 어떻게 되나요?
- `new[]`로 할당한 배열을 `delete`로 해제하면, 배열의 각 요소 소멸자가 올바르게 호출되지 않아 메모리 누수나 정의되지 않은 동작이 발생할 수 있습니다.
- `new`로 할당한 단일 객체를 `delete[]`로 해제하면 역시 정의되지 않은 동작이며, 프로그램 충돌이 발생할 수 있습니다.

5. 예제
```cpp
class Test {
public:
~Test() { std::cout << "Destructor called\n"; }
};

// 단일 객체
Test* obj = new Test;
delete obj; // Destructor 한 번 호출

// 배열 객체
Test* arr = new Test[3];
delete[] arr; // Destructor 3번 호출
```

6. 요약
- `new` ↔ `delete` 쌍
- `new[]` ↔ `delete[]` 쌍
항상 이 규칙을 지켜야 안전하고 올바른 메모리 해제가 가능합니다.

---

결론:
`delete`는 단일 객체 해제, `delete[]`는 배열 객체 해제용이다. 이 둘은 내부 소멸자 호출 횟수와 메모리 해제 방식에서 차이가 있으므로 혼용하면 안되고, 대응하는 `new` 또는 `new[]`와 쌍을 이루어 사용해야 한다.
C++에서 메모리 관리는 매우 중요한 주제이며, `delete`와 `delete[]`는 동적으로 할당된 메모리를 해제하는 데 사용되는 두 가지 연산자입니다.

이 두 연산자는 사용되는 상황에 따라 다르며, 올바르게 사용하지 않으면 메모리 누수나 프로그램의 비정상 종료와 같은 문제를 일으킬 수 있습니다.

아래에서 이 두 연산자의 차이점과 사용 방법에 대해 자세히 설명하겠습니다.

1. 기본 개념 - delete : `delete` 연산자는 동적으로 할당된 단일 객체를 해제하는 데 사용됩니다.

즉, `new` 연산자를 사용하여 생성된 객체를 삭제할 때 사용합니다.

- delete[] : `delete[]` 연산자는 동적으로 할당된 배열을 해제하는 데 사용됩니다.

즉, `new[]` 연산자를 사용하여 생성된 배열을 삭제할 때 사용합니다.



2. 사용 예시 ```cpp // 단일 객체의 동적 할당 및 해제 int* singleInt = new int(

5); // int형 단일 객체를 동적으로 할당 delete singleInt; // 메모리 해제 // 배열의 동적 할당 및 해제 int* intArray = new int[10]; // int형 배열을 동적으로 할당 delete[] intArray; // 메모리 해제 ```

3. 메모리 해제의 중요성 C++에서는 메모리를 수동으로 관리해야 하므로, 동적으로 할당한 메모리를 해제하지 않으면 메모리 누수가 발생할 수 있습니다.

메모리 누수는 프로그램의 성능을 저하시킬 뿐만 아니라, 장기적으로는 시스템의 메모리를 고갈시킬 수 있습니다.

따라서, `new`로 할당한 메모리는 반드시 `delete`로 해제하고, `new[]`로 할당한 메모리는 반드시 `delete[]`로 해제해야 합니다.



4. 차이점 요약 - 대상 : - `delete`는 단일 객체를 해제하는 데 사용됩니다.

- `delete[]`는 배열을 해제하는 데 사용됩니다.

- 메모리 관리 : - `delete`는 객체의 소멸자를 호출하고, 메모리를 해제합니다.

- `delete[]`는 배열의 각 요소에 대해 소멸자를 호출한 후, 전체 배열의 메모리를 해제합니다.

- 사용 시 주의사항 : - `delete`로 배열을 해제하려고 하거나, `delete[]`로 단일 객체를 해제하려고 하면 정의되지 않은 동작(Undefined Behavior)이 발생할 수 있습니다.

이는 프로그램의 비정상 종료나 데이터 손상을 초래할 수 있습니다.



5. 예외 처리 C++에서는 예외가 발생할 수 있는 상황이 많습니다.

예외가 발생하면, 메모리 해제를 적절히 수행하지 않으면 메모리 누수가 발생할 수 있습니다.

이를 방지하기 위해 스마트 포인터(smart pointer)와 같은 RAII(Resource Acquisition Is Initialization) 기법을 사용하는 것이 좋습니다.

스마트 포인터는 메모리 관리의 복잡성을 줄이고, 메모리 누수를 방지하는 데 도움을 줍니다.

결론 C++에서 `delete`와 `delete[]`는 메모리 해제를 위한 필수적인 도구입니다.

이 두 연산자의 올바른 사용은 메모리 관리의 기본이며, 잘못된 사용은 프로그램의 안정성과 성능에 심각한 영향을 미칠 수 있습니다.

따라서, 동적 메모리를 사용할 때는 항상 어떤 연산자를 사용해야 하는지 명확히 이해하고, 적절한 메모리 해제를 수행하는 것이 중요합니다.

작성자: 박지후 [비회원] | 작성일자: 1년 전 2024-09-20 17:11:32
조회수: 137 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.