320x100

프로그래밍/C,C++ 32

Release 프로그램의 비정상 종료시 덤프를 무조건 남기기

가끔 Release 모드로 빌드한 프로그램이 비정상 종료될 때 덤프가 안남는 경우가 있다.그럴 땐 마이크로소프트에서 만든 해당 툴을 사용해 프로세스를 감시하면, 비정상 종료시 덤프가 발생한다. 다운로드https://learn.microsoft.com/ko-kr/sysinternals/downloads/procdump 실행procdump.exe -mp -w -e -h -64 ProcessName.exe D:\Folder\ -mp: mini dump plus (full dump는 오래 걸림)-w: 대상 프로세스가 실행될 때까지 대기-e: 프로세스 내에서 처리되지 않는 exception 발생시 dump-h: 응답 없음 발생시 dump-64: 64비트 dump

UTF-8 문자열 관리

C++20부터 char8_t, u8string등 UTF-8을 지원하기 위한 타입이 추가되었으나, 다른 라이브러리와의 호환등을 위해 개인적으론 아직 char와 string을 주로 사용하고 있다. UTF-8에서 한글은 3바이트를 사용하는데, UTF-8 문자 "가" 는 각 바이트에 234, 176, 128로 저장된다. 유니코드표에서 "가"를 찾아보면 U+AC00 이라고 되어있고, AC00는 2바이트(172, 0) 값인데, 저렇게 저장되는 이유는 각 바이트는 다음 그림과 같은 기본 규칙이 있기 때문이다. 표에 의하면 기본적으로 3바이트를 쓰는 한글은 기본 1110xxxx 10xxxxxx 10xxxxxx 값이 정해져 있고, 유니코드의 HEX값은 x에 치환되는 값만 표에 적어둔 것이다. 0xAC00을 0b로 변경하..

확인할 수 없는 외부 기호

LNK1120 1개의 확인할 수 없는 외부 참조입니다. LNK2019 "public: int __cdecl ClassName::FunctionName() " (?FunctionName@ClassName@@~~~~~~)" ~~~ 함수에서 참조되는 확인할 수 없는 외부 기호 에러가 뜨면서 빌드가 실패하는 경우의 문제점으로는 부모 클래스로부터 상속 받은 함수(비가상함수)를 자식 클래스가 본인 함수에서 inline으로 선언하는 경우 해당 함수 주소를 찾지 못해 에러가 난다.

memmove_s 함수

MSDN: https://docs.microsoft.com/ko-kr/cpp/c-runtime-library/reference/memmove-s-wmemmove-s?view=msvc-170 원형은 다음과 같다. errno_t memmove_s( void *dest, size_t numberOfElements, const void *src, size_t count ); errno_t wmemmove_s( wchar_t *dest, size_t numberOfElements, const wchar_t *src, size_t count ); 변수명은 number of Elements 라고 되어있지만 갯수(_countof())가 아닌 사이즈(sizeof())를 넘겨야 된다. 예제는 seq 번째 데이터들을 앞으로..

virtual, override, final 관련 정리

virtual 키워드는 상속 받는 자식 클래스에서 override해서 구현하라는 의미로 부모클래스에서 사용된다. 보통의 가상 함수는 override를 강제하지 않고 옵션으로 두지만, 순수 가상 함수로 선언해 자식 클래스에서 무조건 구현해야 하도록 만들 수 있다. override 키워드는 부모의 가상함수를 재정의 했다는 의미로 사용된다. 재정의 하는 경우는 다음과 같은 성질을 만족해야 한다. 부모 클래스 함수가 반드시 가상 함수 이어야한다. 부모의 함수와 자식의 함수 이름이 반드시 동일해야한다. (소멸자 예외) 부모의 함수와 자식의 함수 매개변수 형식들이 반드시 동일해야한다. 부모의 함수와 자식의 함수 const 성이 반드시 동일해야한다. 부모의 함수와 자식의 함수 반환형식과 예외 명세가 호환되어야한다. ..

Macro 확장을 이용한 factory 만들기

특정 인터페이스 class를 상속하는 class가 있을 때,factory를 이용해서 이름으로 각각의 class instance를 생성해보자! 가 목표입니다. #define DO_REGISTER(e) \ registry_[#e] = &templated_creator::create; #define FACTORY_IMPL(factoryname, producttype, products) \ class factoryname \ { \ typedef producttype* (*creator)(); \ template \ class templated_creator \ { \ public: \ static Base_* create() { return new Derived_(); }\ }; \ public: \ fact..

320x100