[C++] delete

BananaCube·2023년 2월 27일

delete와 delete[]는 C++에서 동적으로 할당한 메모리를 해제하는 연산자입니다.

delete는 new 연산자로 할당한 단일 객체의 메모리를 해제하는 데 사용됩니다. 예를 들어, 다음과 같이 객체를 동적으로 할당한 후 delete로 메모리를 해제할 수 있습니다.

MyClass* p = new MyClass;
delete p;

delete[]는 new[] 연산자로 할당한 배열의 메모리를 해제하는 데 사용됩니다. 예를 들어, 다음과 같이 배열을 동적으로 할당한 후 delete[]로 메모리를 해제할 수 있습니다.

int* arr = new int[10];
delete[] arr;

주의할 점은, delete로 배열을 해제하거나, delete[]로 단일 객체를 해제하는 것은 메모리 누수나 예기치 못한 동작을 야기할 수 있습니다. 따라서, new와 delete 혹은 new[]와 delete[]는 서로 짝을 이루어 사용하는 것이 안전합니다.

아래는 이창현 코딩연구소라는 블로그에서 퍼온 글이다.
출처 : https://m.blog.naver.com/PostView.nhn?isHttpsRedirect=true&blogId=jamsuham75&logNo=221102478481

오늘 C++ 동적 메모리 할당 관련 강의 중에 한 수강생이 이런 질문을 했다.

new 연산자로 힙에 동적 배열로 할당했을 경우 해제 시 delete[]가 아닌 delete를 사용해도 해제 되지 않느냐는 질문이였다.

예를 들면 이런 것이다.

int* p = new int[5];
delete p;
//delete[] p;

가리키는 p포인터는 결국 주소값이므로 delete나 delete[]나 상관 없지 않느냐는 질문의 의도이다.
그런데, 일단 결론부터 말하면 "상관이 있다"이다.

4바이트 int 타입 5개를 생성하고 메모리를 delete[]로 해제할 경우 각 배열의 요소를 4바이트씩 5번 해제하지만, delete만 사용하게 되면 4바이트짜리 메모리를 한 번만 해제한다.

우리가 new 연산자를 사용하여 메모리 할당 시 배열의 크기에 대한 정보를 저장하기 위해 내부적으로 4바이트 만큼의 메모리를 더 할당한다. 이 메모리를 해제할 때 delete[]를 사용하면 이 값을 확인하여 해제하지만, delete만 사용하면 배열의 크기를 확인하지 않고 해제하게 된다.

예제를 하나 작성해서 증명을 해보도록 하자.

#include <iostream>
#include <crtdbg.h>
using namespace std;

class CTest
{
//// 멤버변수
private:
	int iTemp;

public:


//// 멤버함수
private:

public:
	CTest()
	{
		cout << "나는 생성자" << endl;
	}
	~CTest()
	{
		cout << "나는 소멸자" << endl;
	}
};


int main()
{
	_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);

	CTest * pTest = new CTest[2];
	delete pTest;

	return 0;
}

profile
C++ 독학한 내용을 정리하는 벨로그입니다.

0개의 댓글