루리코딩 세상

Delete, Release는 뭐가 다를까..? 본문

개인 개발일지/error 모음

Delete, Release는 뭐가 다를까..?

루리딩 2025. 6. 7. 23:42

Definitions.h에서 선언해줬던 문제점이었는데,

Release에서 Delete로 변경하니 오류코드가 사라졌다.

둘 다 리소스를 해제한다는 점에서는 같은 역할 인 것 같은데

왜 일까..? 무슨 차이점인지 찾아봐야겠다

항목 Delete  Release
사용 환경 일반 C++ COM(Component Object Model), DirectX 등
대상 new로 생성한 객체 (메모리) COM 객체 (참조 카운트 기반 자원)
역할 메모리 해제 참조 카운트를 줄이고 0이면 객체 삭제
호출 방식 키워드 (delete ptr;) 함수 호출 (ptr->Release();)
자동 호출 여부 직접 호출 필요 스마트 포인터 사용 시 자동 호출 가능

✅ delete란?

new로 생성한 메모리를 해제하는 C++ 키워드

int* p = new int(5);
delete p; // 메모리 해제
  • delete는 일반적인 C++ 메모리 관리 도구입니다.
  • 객체의 소멸자도 자동으로 호출됩니다.

✅ Release()란?

COM 객체나 DirectX 객체 등에서 참조 카운트를 줄이는 함수

ID3D11Device* device = nullptr;
// 생성 후 ...
device->Release(); // 참조 카운트 감소

 

  • DirectX 등 COM 기반 API는 내부적으로 참조 카운트(Reference Count) 를 유지합니다.
  • Release()는 이 카운트를 1 줄이고, 카운트가 0이 되면 객체가 자동 소멸됩니다.
  • delete로 직접 지우면 undefined behavior가 발생할 수 있음!

✅ COM 객체에서의 흐름 예시

ID3D11Texture2D* texture = nullptr;
device->CreateTexture2D(..., &texture); // 참조 카운트 1

texture->Release(); // 참조 카운트 0 → 자동 소멸

 

✅ 주의할 점

  • COM 객체에는 절대 delete를 직접 사용하지 마세요!
  • COM 객체 해제는 항상 Release() 또는 ComPtr 같은 스마트 포인터 사용!

[D3D.h]에서 선언할 때의 class CD3D로 내부 변수안의

private:으로 만들어졌다. 그럼 같이 Release하면 안되나?

RTV는 이전의 문법으로 (ID3D11Device) -> (ID3D11DeviceContext) -> (adapter) 접근시킨

DirectX이니 COM 으로 Release가 맞는 듯하다. 조금 더 물어보자


CD3D::~CD3D()
{
	Release(Device);             // COM 객체
	Release(DeviceContext);      // COM 객체
	Release(SwapChain);          // COM 객체
	Release(RenderTargetView);   // COM 객체

	Delete(Viewport);            // 일반 C++ 객체
}

✅ Release()를 쓰는 이유: DirectX의 COM 객체

  • Device, DeviceContext, SwapChain, RenderTargetView는 DirectX COM 객체입니다.
  • COM 객체는 참조 카운트 기반으로 관리되며, Release() 호출 시:
    • 내부 참조 카운트가 1 감소
    • 0이 되면 객체 스스로 메모리에서 삭제됨
  • delete를 쓰면 오류 발생 가능 → Release()만 써야 함

✅ Delete()를 쓰는 이유: 일반 C++ 객체

  • Viewport는 C++에서 new로 생성한 일반 포인터 객체일 가능성이 큽니다.
Viewport = new D3D11_VIEWPORT();

이런 식으로 동적 할당했다면 해제는 delete Viewpor

📌 왜 둘 다 쓰는가?

리소스 이름 생성 방식 해제 방식 이유
Device, Context 등 DirectX 내부 생성 (COM) Release() 참조 카운트 기반 해제 필요
Viewport new 연산자 사용 (C++) delete 또는 Delete() 일반 동적 메모리 해제 필요

✅ Delete()가 사용자 정의 매크로일 가능성

Delete(Viewport);가 표준 delete가 아니라면,
다음과 같은 매크로일 수 있습니다:

#define Delete(p) { if(p) { delete (p); (p) = nullptr; } }

→ 안전하게 포인터를 해제하고, 널로 초기화까지 해주는 패턴입니다.


✅ 요약

Release()는 COM 객체를 해제하는 DirectX 방식이고,
Delete()는 일반 C++ 포인터를 해제하는 방식이에요.
즉, Viewport는 일반 메모리이기 때문에 Delete()로 해제한 것입니다.


소멸자에 대해서 정리할 필요가 좀 있어보인다..