Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
Tags
- c++용어정리
- 게임개발
- 월드아웃라이너
- 자료구조
- livrary
- 프로그래밍
- bttask
- 언리얼엔진공부
- ipc(inter process communication)
- c++
- 프로그래밍일기
- c++class
- 게임엔진튜토리얼
- c언어정리
- 자료형타입
- 언리얼엔진
- 각도변환
- directx
- leveleditor
- c++porinter
- 언리얼ai
- 자료구조정리
- 언리얼엔진5
- 수학용어정리
- 영단어정리
- unrealengineai
- 25.06.11dir
- DX
- uaiperception
- 언리얼비헤이어비어트리
Archives
- Today
- Total
루리코딩 세상
Delete, Release는 뭐가 다를까..? 본문
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()로 해제한 것입니다.
소멸자에 대해서 정리할 필요가 좀 있어보인다..

'개인 개발일지 > error 모음' 카테고리의 다른 글
로드 실패 (0) | 2025.06.12 |
---|---|
Unreal Engine 패트롤 비정상 작동 문제 (인스턴스 동기화) / NavMeshBoundsVolume (1) | 2025.06.11 |
Unreal Engine & C++ : 파일 수정 감지 (0) | 2025.06.10 |
d3d RenderTargetView hr 미정의 에러 (0) | 2025.06.07 |