article thumbnail image
Published 2020. 11. 13. 06:33

1. Windows API 같은 API의 일부 메소드는 불리언 값을 반환하는 Verify 매크로를 통해서, 오류 상황을 가정하여 작성되었기 때문에, Assert 만큼 엄격하지는 않다.

 

2. 릴리즈 버전에서 완전히 없애기 곤란한 경우, Verify 매크로를 사용하기 때문에 보조 디버그 도구로 필수적이다.

 

3. Handle 객체는 복사가 일어나지 않기 때문에, 아래 코드는 오류를 발생하는 코드이다. e와 e2는 같은 값을 가지기 때문에, e의 소멸자가 호출되면, e2는 존재하지 않는 주소를 가리키게 되어, e2의 소멸자는 예외를 발생시킨다.

 

#include <crtdbg.h>
#include <Windows.h>
#define ASSERT _ASSERTE

#ifdef _DEBUG
#define VERIFY ASSERT
#else
#define VERIFY(expression) (expression)
#endif

struct LastException {
	DWORD result;
	LastException() :result{ GetLastError() } {}
};

struct ManualResetEvent {
	HANDLE m_handle;

	ManualResetEvent() {
		m_handle = CreateEvent(nullptr, true, false, nullptr);

		if (!m_handle) {
			throw LastException();
		}
	}

	~ManualResetEvent() {
		VERIFY(CloseHandle(m_handle));
	}
};

auto main()->int
{
	auto e = ManualResetEvent{};
	auto e2 = e;
}

'삽질 > COM' 카테고리의 다른 글

RTTI  (0) 2022.07.15
Trace  (0) 2020.11.13
COM study note 8 IUnknown C# 버전  (0) 2020.10.30
COM study note 8 IUnknown 이식  (0) 2020.10.30
COM study note 7  (0) 2020.10.29
복사했습니다!