Charset and CodePage 정리표

구분

Charset CodePage
한국어 ks_c_5601-1987 949
IBM EBCDIC(미국-캐나다) IBM037 37
OEM 미국 IBM437 437
IBM EBCDIC(국제) IBM500 500
아랍어(ASMO 708) ASMO-708 708
아랍어(DOS) DOS-720 720
그리스어(DOS) ibm737 737
발트어(DOS) ibm775 775
서유럽어(DOS) ibm850 850
중앙 유럽어(DOS) ibm852 852
OEM 키릴 자모 IBM855 855
터키어(DOS) ibm857 857
OEM 다국 라틴 문자 I IBM00858 858
포르투갈어(DOS) IBM860 860
아이슬란드어(DOS) ibm861 861
히브리어(DOS) DOS-862 862
프랑스어(캐나다)(DOS) IBM863 863
아랍어(864) IBM864 864
북유럽어(DOS) IBM865 865
키릴 자모(DOS) cp866 866
현대 그리스어(DOS) ibm869 869
IBM EBCDIC(다국 라틴 문자-2) IBM870 870
태국어(Windows) windows-874 874
IBM EBCDIC(현대 그리스어) cp875 875
일본어(Shift-JIS) iso-2022-jp 932
중국어 간체(GB2312) gb2312 936
한국어 ks_c_5601-1987 949
중국어 번체(Big5) big5 950
IBM EBCDIC(터키어 라틴 문자-5) IBM1026 1026
IBM 라틴어-1 IBM01047 1047
IBM EBCDIC(미국-캐나다-유럽) IBM01140 1140
IBM EBCDIC(독일-유럽) IBM01141 1141
IBM EBCDIC(덴마크-노르웨이-유럽) IBM01142 1142
IBM EBCDIC(핀란드-스웨덴-유럽) IBM01143 1143
IBM EBCDIC(이탈리아-유럽) IBM01144 1144
IBM EBCDIC(스페인-유럽) IBM01145 1145
IBM EBCDIC(영국-유럽) IBM01146 1146
IBM EBCDIC(프랑스-유럽) IBM01147 1147
IBM EBCDIC(국제-유럽) IBM01148 1148
IBM EBCDIC(아이슬란드어-유럽) IBM01149 1149
유니코드 utf-16 1200
유니코드(Big-Endian) unicodeFFFE 1201
중앙 유럽어(Windows) windows-1250 1250
키릴 자모(Windows) windows-1251 1251
서유럽어(Windows) Windows-1252 1252
그리스어(Windows) windows-1253 1253
터키어(Windows) windows-1254 1254
히브리어(Windows) windows-1255 1255
아랍어(Windows) windows-1256 1256
발트어(Windows) windows-1257 1257
베트남어(Windows) windows-1258 1258
한국어(조합) Johab 1361
서유럽어(Mac) macintosh 10000
일본어(Mac) x-mac-japanese 10001
중국어 번체(Mac) x-mac-chinesetrad 10002
한국어(Mac) x-mac-korean 10003
아랍어(Mac) x-mac-arabic 10004
히브리어(Mac) x-mac-hebrew 10005
그리스어(Mac) x-mac-greek 10006
키릴 자모(Mac) x-mac-cyrillic 10007
중국어 간체(Mac) x-mac-chinesesimp 10008
루마니아어(Mac) x-mac-romanian 10010
우크라이나어(Mac) x-mac-ukrainian 10017
태국어(Mac) x-mac-thai 10021
중앙 유럽어(Mac) x-mac-ce 10029
아이슬란드어(Mac) x-mac-icelandic 10079
터키어(Mac) x-mac-turkish 10081
크로아티아어(Mac) x-mac-croatian 10082
중국어 번체(CNS) x-Chinese-CNS 20000
TCA 대만 x-cp20001 20001
중국어 번체(Eten) x-Chinese-Eten 20002
IBM5550 대만 x-cp20003 20003
TeleText 대만 x-cp20004 20004
Wang 대만 x-cp20005 20005
서유럽어(IA5) x-IA5 20105
독일어(IA5) x-IA5-German 20106
스웨덴어(IA5) x-IA5-Swedish 20107
노르웨이어(IA5) x-IA5-Norwegian 20108
US-ASCII us-ascii 20127
T.61 x-cp20261 20261
ISO-6937 x-cp20269 20269
IBM EBCDIC(독일) IBM273 20273
IBM EBCDIC(덴마크-노르웨이) IBM277 20277
IBM EBCDIC(핀란드-스웨덴) IBM278 20278
IBM EBCDIC(이탈리아) IBM280 20280
IBM EBCDIC(스페인) IBM284 20284
IBM EBCDIC(일본어 가타카나) IBM290 20290
IBM EBCDIC(프랑스) IBM297 20297
IBM EBCDIC(아랍어) IBM420 20420
IBM EBCDIC(그리스어) IBM423 20423
IBM EBCDIC(히브리어) IBM424 20424
IBM EBCDIC(한국어 확장) x-EBCDIC-KoreanExtended 20833
IBM EBCDIC(태국어) IBM-Thai 20838
키릴 자모(KOI8-R) koi8-r 20866
IBM EBCDIC(아이슬란드어) IBM871 20871
IBM EBCDIC(키릴 자모 러시아어) IBM880 20880
IBM EBCDIC(터키어) IBM905 20905
IBM 라틴어-1 IBM00924 20924
일본어(JIS 0208-1990 및 0212-1990) EUC-JP 20932
중국어 간체(GB2312-80) x-cp20936 20936
한국어(완성) x-cp20949 20949
IBM EBCDIC(키릴 자모 세르비아어-불가리아어) cp1025 21025
Ext Alpha 소문자 x-cp21027 21027
키릴 자모(KOI8-U) koi8-u 21866
서유럽어(ISO) iso-8859-1 28591
중앙 유럽어(ISO) iso-8859-2 28592
라틴어 3(ISO) iso-8859-3 28593
발트어(ISO) iso-8859-4 28594
키릴 자모(ISO) iso-8859-5 28595
아랍어(ISO) iso-8859-6 28596
그리스어(ISO) iso-8859-7 28597
히브리어(ISO-Visual) iso-8859-8 28598
터키어(ISO) iso-8859-9 28599
에스토니아어(ISO) iso-8859-13 28603
라틴어 9(ISO) iso-8859-15 28605
히브리어(ISO-Logical) iso-8859-8-i 38598
일본어(JIS) iso-2022-jp 50220
일본어(JIS-Allow 1 byte Kana) iso-2022-jp 50221
일본어(JIS-Allow 1 byte Kana - SO/SI) iso-2022-jp 50222
한국어(ISO) euc-kr 50225
중국어 간체(ISO-2022) x-cp50227 50227
일본어(EUC) euc-jp 51932
중국어 간체(EUC) EUC-CN 51936
한국어(EUC) euc-kr 51949
중국어 간체(HZ) hz-gb-2312 52936
중국어 간체(GB18030) GB18030 54936
유니코드(UTF-7) utf-7 65000
유니코드(UTF-8) utf-8 65001

 

Generic-text SBCS (_UNICODE & _MBCS _UNICODE defined 
routine name  MBCS not defined) defined 
_cgetts _cgets _cgets _cgetws
_cgetts_s _cgets_s _cgets_s _cgetws_s
_cputts _cputs _cputs _cputws
_fgettc fgetc fgetc fgetwc
_fgettchar _fgetchar _fgetchar _fgetwchar
_fgetts fgets fgets fgetws
_fputtc fputc fputc fputwc
_fputtchar _fputchar _fputchar _fputwchar
_fputts fputs fputs fputws
_ftprintf fprintf fprintf fwprintf
_ftprintf_s fprintf_s fprintf_s fwprintf_s
_ftscanf fscanf fscanf fwscanf
_ftscanf_s fscanf_s fscanf_s fwscanf_s
_gettc getc getc getwc
_gettch _getch _getch _getwch
_gettchar getchar getchar getwchar
_gettche _getche _getche _getwche
_getts gets gets getws
_getts_s gets_s gets_s getws_s
_istalnum isalnum _ismbcalnum iswalnum
_istalpha isalpha _ismbcalpha iswalpha
_istascii isascii isascii iswascii
_istcntrl iscntrl iscntrl iswcntrl
_istdigit isdigit _ismbcdigit iswdigit
_istgraph isgraph _ismbcgraph iswgraph
_istlead Always returns false _ismbblead Always returns false
_istleadbyte Always returns false isleadbyte Always returns false
_istlegal Always returns true _ismbclegal Always returns true
_istlower islower _ismbclower iswlower
_istprint isprint _ismbcprint iswprint
_istpunct ispunct _ismbcpunct iswpunct
_istspace isspace _ismbcspace iswspace
_istupper isupper _ismbcupper iswupper
_istxdigit isxdigit isxdigit iswxdigit
_itot _itoa _itoa _itow
_itot_s _itoa_s _itoa_s _itow_s
_ltot _ltoa _ltoa _ltow
_ltot_s _ltoa_s _ltoa_s _ltow_s
_puttc putc putc putwc
_puttch _putch _putch _putwch
_puttchar putchar putchar putwchar
_putts puts puts _putws
_sctprintf _scprintf _scprintf _scwprintf
_sntprintf _snprintf _snprintf _snwprintf
_sntprintf_s _snprintf_s _snprintf_s _snwprintf_s
_sntscanf _snscanf _snscanf _snwscanf
_sntscanf_s _snscanf_s _snscanf_s _snwscanf_s
_stprintf sprintf sprintf swprintf
_stprintf_s sprintf_s sprintf_s swprintf_s
_stscanf sscanf sscanf swscanf
_stscanf_s sscanf_s sscanf_s swscanf_s
_taccess _access _access _waccess
_taccess_s _access_s _access_s _waccess_s
_tasctime asctime asctime _wasctime
_tasctime_s asctime_s asctime_s _wasctime_s
_tccmp Maps to macro or inline function _mbsncmp Maps to macro or inline function
_tccpy Maps to macro or inline function _mbccpy Maps to macro or inline function
_tccpy_s strcpy_s _mbccpy_s wcscpy_s
_tchdir _chdir _chdir _wchdir
_tclen Maps to macro or inline function _mbclen Maps to macro or inline function
_tchmod _chmod _chmod _wchmod
_tcprintf _cprintf _cprintf _cwprintf
_tcprintf_s _cprintf_s _cprintf_s _cwprintf_s
_tcreat _creat _creat _wcreat
_tcscanf _cscanf _cscanf _cwscanf
_tcscanf_s _cscanf_s _cscanf_s _cwscanf_s
_tcscat strcat _mbscat wcscat
_tcscat_s strcat_s _mbscat_s wcscat_s
_tcschr strchr _mbschr wcschr
_tcsclen strlen _mbslen wcslen
_tcsclen_s strlen_s _mbslen_s wcslen_s
_tcscmp strcmp _mbscmp wcscmp
_tcscoll strcoll _mbscoll wcscoll
_tcscpy strcpy _mbscpy wcscpy
_tcscpy_s strcpy_s _mbscpy_s wcscpy_s
_tcscspn strcspn _mbscspn wcscspn
_tcsdec _strdec _mbsdec _wcsdec
_tcsdup _strdup _mbsdup _wcsdup
_tcserror strerror strerror _wcserror
_tcserror_s strerror_s strerror_s _wcserror_s
_tcsftime strftime strftime wcsftime
_tcsicmp _stricmp _mbsicmp _wcsicmp
_tcsicoll _stricoll _mbsicoll _wcsicoll
_tcsinc _strinc _mbsinc _wcsinc
_tcslen strlen strlen wcslen
_tcslen_s strlen_s strlen_s wcslen_s
_tcslwr _strlwr _mbslwr _wcslwr
_tcslwr_s _strlwr_s _mbslwr_s _wcslwr_s
_tcsnbcnt _strncnt _mbsnbcnt _wcsncnt
_tcsncat strncat _mbsnbcat wcsncat
_tcsncat_s strncat_s _mbsnbcat_s wcsncat_s
_tcsnccat strncat _mbsncat wcsncat
_tcsnccmp strncmp _mbsncmp wcsncmp
_tcsnccmp_s strncmp_s _mbsncmp_s wcsncmp_s
_tcsnccoll _strncoll _mbsncoll _wcsncoll
_tcsncmp strncmp _mbsnbcmp wcsncmp
_tcsnccnt _strncnt _mbsnccnt _wcsncnt
_tcsnccpy strncpy _mbsncpy wcsncpy
_tcsnccpy_s strncpy_s _mbsncpy_s wcsncpy_s
_tcsncicmp _strnicmp _mbsnicmp _wcsnicmp
_tcsncicoll _strnicoll _mbsnicoll _wcsnicoll
_tcsncpy strncpy _mbsnbcpy wcsncpy
_tcsncpy_s strncpy_s _mbsnbcpy_s wcsncpy_s
_tcsncset _strnset _mbsnset _wcsnset
_tcsnextc _strnextc _mbsnextc _wcsnextc
_tcsnicmp _strnicmp _mbsnbicmp _wcsnicmp
_tcsnicoll _strnicoll _mbsnbicoll _wcsnicoll
_tcsninc _strninc _mbsninc _wcsninc
_tcsnccnt _strncnt _mbsnccnt _wcsncnt
_tcsnset _strnset _mbsnbset _wcsnset
_tcspbrk strpbrk _mbspbrk wcspbrk
_tcsspnp _strspnp _mbsspnp _wcsspnp
_tcsrchr strrchr _mbsrchr wcsrchr
_tcsrev _strrev _mbsrev _wcsrev
_tcsset _strset _mbsset _wcsset
_tcsspn strspn _mbsspn wcsspn
_tcsstr strstr _mbsstr wcsstr
_tcstod strtod strtod wcstod
_tcstoi64 _strtoi64 _strtoi64 _wcstoi64
_tcstok strtok _mbstok wcstok
_tcstok_s strtok_s _mbstok_s wcstok_s
_tcstol strtol strtol wcstol
_tcstoui64 _strtoui64 _strtoui64 _wcstoui64
_tcstoul strtoul strtoul wcstoul
_tcsupr _strupr _mbsupr _wcsupr
_tcsupr_s _strupr_s _mbsupr_s _wcsupr_s
_tcsxfrm strxfrm strxfrm wcsxfrm
_tctime ctime ctime _wctime
_tctime_s ctime_s ctime_s _wctime_s
_tctime32 _ctime32 _ctime32 _wctime32
_tctime32_s _ctime32_s _ctime32_s _wctime32_s
_tctime64 _ctime64 _ctime64 _wctime64
_tctime64_s _ctime64_s _ctime64_s _wctime64_s
_texecl _execl _execl _wexecl
_texecle _execle _execle _wexecle
_texeclp _execlp _execlp _wexeclp
_texeclpe _execlpe _execlpe _wexeclpe
_texecv _execv _execv _wexecv
_texecve _execve _execve _wexecve
_texecvp _execvp _execvp _wexecvp
_texecvpe _execvpe _execvpe _wexecvpe
_tfdopen _fdopen _fdopen _wfdopen
_tfindfirst _findfirst _findfirst _wfindfirst
_tfindnext _findnext _findnext _wfindnext
_tfindnext32 _findnext32 _findnext32 _wfindnext32
_tfindnext64 _findnext64 _findnext64 _wfindnext64
_tfindnexti64 _findnexti64 _findnexti64 _wfindnexti64
_tfindnexti6432 _findnexti6432 _findnexti6432 _wfindnexti6432
_tfindnext32i64 _findnext32i64 _findnext32i64 _wfindnext32i64
_tfopen fopen fopen _wfopen
_tfopen_s fopen_s fopen_s _wfopen_s
_tfreopen freopen freopen _wfreopen
_tfreopen_s freopen_s freopen_s _wfreopen_s
_tfsopen _fsopen _fsopen _wfsopen
_tfullpath _fullpath _fullpath _wfullpath
_tgetcwd _getcwd _getcwd _wgetcwd
_tgetdcwd _getdcwd _getdcwd _wgetdcwd
_tgetenv getenv getenv _wgetenv
_tgetenv_s getenv_s getenv_s _wgetenv_s
_tmain main main wmain
_tmakepath _makepath _makepath _wmakepath
_tmakepath_s _makepath_s _makepath_s _wmakepath_s
_tmkdir _mkdir _mkdir _wmkdir
_tmktemp _mktemp _mktemp _wmktemp
_tmktemp_s _mktemp_s _mktemp_s _wmktemp_s
_topen _open _open _wopen
_topen_s _open_s _open_s _wopen_s
_totlower tolower _mbctolower towlower
_totupper toupper _mbctoupper towupper
_tperror perror perror _wperror
_tpopen _popen _popen _wpopen
_tprintf printf printf wprintf
_tprintf_s printf_s printf_s wprintf_s
_tputenv _putenv _putenv _wputenv
_tputenv_s _putenv_s _putenv_s _wputenv_s
_tremove remove remove _wremove
_trename rename rename _wrename
_trmdir _rmdir _rmdir _wrmdir
_tsearchenv _searchenv _searchenv _wsearchenv
_tsearchenv_s _searchenv_s _searchenv_s _wsearchenv_s
_tscanf scanf scanf wscanf
_tscanf_s scanf_s scanf_s wscanf_s
_tsetlocale setlocale setlocale _wsetlocale
_tsopen _sopen _sopen _wsopen
_tsopen_s _sopen_s _sopen_s _wsopen_s
_tspawnl _spawnl _spawnl _wspawnl
_tspawnle _spawnle _spawnle _wspawnle
_tspawnlp _spawnlp _spawnlp _wspawnlp
_tspawnlpe _spawnlpe _spawnlpe _wspawnlpe
_tspawnv _spawnv _spawnv _wspawnv
_tspawnve _spawnve _spawnve _wspawnve
_tspawnvp _spawnvp _spawnvp _wspawnvp
_tspawnvpe _spawnvpe _spawnvpe _wspawnvpe
_tsplitpath _splitpath _splitpath _wsplitpath
_tstat _stat _stat _wstat
_tstat32 _stat32 _stat32 _wstat32
_tstati32 _stati32 _stati32 _wstati32
_tstat64 _stat64 _stat64 _wstat64
_tstati64 _stati64 _stati64 _wstati64
_tstof atof atof _wtof
_tstoi atoi atoi _wtoi
_tstoi64 _atoi64 _atoi64 _wtoi64
_tstol atol atol _wtol
_tstrdate _strdate _strdate _wstrdate
_tstrdate_s _strdate_s _strdate_s _wstrdate_s
_tstrtime _strtime _strtime _wstrtime
_tstrtime_s _strtime_s _strtime_s _wstrtime_s
_tsystem system system _wsystem
_ttempnam _tempnam _tempnam _wtempnam
_ttmpnam tmpnam tmpnam _wtmpnam
_ttmpnam_s tmpnam_s tmpnam_s _wtmpnam_s
_ttoi atoi atoi _wtoi
_ttoi64 _atoi64 _atoi64 _wtoi64
_ttol atol atol _wtol
_tunlink _unlink _unlink _wunlink
_tutime _utime _utime _wutime
_tutime32 _utime32 _utime32 _wutime32
_tutime64 _utime64 _utime64 _wutime64
_tWinMain WinMain WinMain wWinMain
_ui64tot _ui64toa _ui64toa _ui64tow
_ui64tot_s _ui64toa_s _ui64toa_s _ui64tow_s
_ultot _ultoa _ultoa _ultow
_ultot_s _ultoa_s _ultoa_s _ultow_s
_ungettc ungetc ungetc ungetwc
_ungettch _ungetch _ungetch _ungetwch
_vftprintf vfprintf vfprintf vfwprintf
_vftprintf_s vfprintf_s vfprintf_s vfwprintf_S
_vsctprintf _vscprintf _vscprintf _vscwprintf
_vsctprintf_s _vscprintf_s _vscprintf_s _vscwprintf_S
_vsntprintf _vsnprintf _vsnprintf _vsnwprintf
_vsntprintf_s _vsnprintf_s _vsnprintf_s _vsnwprintf_s
_vstprintf vsprintf vsprintf vswprintf
_vstprintf_s vsprintf_s vsprintf_s vswprintf_s
_vtprintf vprintf vprintf vwprintf
_vtprintf_s vprintf_s vprintf_s vwprintf_s 


펌글

CRT( C Runtime library )를 사용합시다.

아래의 코드를 사용하면 메모리 릭( 메모리 누수, Memory Leak )에 효과적으로 대처할 수 있다.

주의할 점은 사용법을 명확히 숙지하고서 사용할 것.

Introduce.

int WINAPI wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow )
{
// Enable run-time memory check for debug builds.
#if defined(DEBUG) | defined(_DEBUG)
_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
#endif

다이렉트 X예제를 살펴보면 wWinMain시작 부분에 위와 같은 코드를 만날 수 있다.

이 코드는 디버그 시에 메모리릭이 발생하면 출력창에 몇 번지에서 얼마 크기의 메모리가 해제되지 않았는지를 표시 해 준다.

또한 메모리릭을 체크하기 위해서 <crtdbg.h>를 인클루드 해 줘야 하는데 DXUT.H를 인클루드 했다면 내부에서 <crtdbg.h>를

인클루드 해 주므로 따로 해 줄 필요가 없다.

아래에서 #define new 부분만 처리 해 주자.

아래에서 사용하는 코드들은

#if defined(DEBUG) | defined(_DEBUG)

로 감싸져 있기 때문에 릴리즈 모드에서는 동작하지 않는다. 또한 릴리즈 모드에서는 인클루드 자체가 제외 되기 때문에 효율을 걱정할

필요가 없다.

Step 1.

#if defined(DEBUG) || defined(_DEBUG)
#include <crtdbg.h>
#define new new(_CLIENT_BLOCK, __FILE__, __LINE__)

_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );

#endif

필요한 헤더를 인클루드 해 주고

#define new new(_CLIENT_BLOCK, __FILE__, __LINE__)

new자체를 새로 정의 해 버렸다. 메모리 릭 보고를 해 줄 때 릭을 발생시킨 녀석의 파일 이름과 라인을 출력 해 주어서 디버깅 시에 출력창에서 바로 찾아볼 수 있다. __FILE__과 __LINE__는 미리 정의된 매크로로 가끔 사용해 주면 유용하다.

_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
이 녀석이 실제적으로 출력창에 메모리 릭 보고를 해 준다. 5가지의 Flag가 있다.

_CRTDBG_ALLOC_MEM_DF

디폴트로 켜져 있으며, 디버그 버전에서 모든 메모리 할당이 일어날 때마다 추적 가능하도록 특별한 기능을 추가해 둔다. 이 플랙이 켜져 있어야 메모리 누수를 안전하게 검사 할 수 있다.
_CRTDBG_DELAY_FREE_MEM_DF

delete, free등으로 삭제되어도 바로 삭제되지 않고, CRT의 메모리 관리소에 남아 있다가 프로그램 종료시에 완전히 삭제된다.
_CRTDBG_CHECK_ALWAYS_DF

모든 메모리관련 연산에서 _CrtCheckMemory를 호출한다.
_CRTDBG_CHECK_CRT_DF

CRT가 내부적으로 할당한 블록도 메모리를 체크할 때 포함한다. 일반적으로는 CRT가 할당한 블록은 메모리 체크에서 제외된다. 일반적으로 사용하지 않는다
_CRTDBG_LEAK_CHECK_DF

프로그램이 완전히 종료되기 직전에 아직 해제되지 않은 메모리가 있는지 검사한다. 프로그램의 종료 포인트가 여러군데 있는 경우에 사용하면 일일이 _CrtDumpMemoryLeaks 메소드를 호출하지 않아도 자동적으로 메모리 누수를 검사할 수 있게된다.

Step 2.

메모리 할당이 시작되기 이전에 최상위에 만들어 두자.

Step 3.

Detected memory leaks!
Dumping objects ->
{840} normal block at 0x0109E460, 320 bytes long.
Data: < _ > 9C 07 5F 00 CD CD CD CD CD CD CD CD CD CD CD CD
{838} normal block at 0x0109E398, 46 bytes long.
Data: <1 m B o x A > 31 00 6D 00 20 00 42 00 6F 00 78 00 20 00 41 00
{837} normal block at 0x0109E258, 260 bytes long.
Data: <testAlpha.tga > 74 65 73 74 41 6C 70 68 61 2E 74 67 61 00 CD CD
{836} normal block at 0x0109E218, 4 bytes long.
Data: < e > C0 65 1C 00
{835} normal block at 0x0109E198, 68 bytes long.
Data: < ? ? ? ?> 00 00 80 3F 00 00 80 3F 00 00 80 3F 00 00 80 3F
{834} normal block at 0x0109E128, 48 bytes long.
Data: < _ SA `W > A8 09 5F 00 98 E3 09 01 18 53 41 01 60 57 1C 00
Object dump complete.
D3DX: MEMORY LEAKS DETECTED: 3 allocations unfreed (708 bytes)
D3DX: Set HKLM\Software\Microsoft\Direct3D\D3DXBreakOnAllocId=0x21b to debug

고의적인 릭 발생이다.

#define로 new를 매크로로 씌워 놓은 것은 다이렉트에서 사용하는 메모리 체크 기능때문인지 제대로 안먹히는것 같아 보인다.

메모리릭은 첫번째 할당된 순서 그리고 주소 크기를 보여주고

메모리 안에 위치한 데이터를 보여준다.

DXUT를 사용하지 않은 프로젝트에서는 new를 매크로로 씌워 놓았을 때 출력창에서 릭이 발생한 파일과 줄 번호가 표시되어 이를 더블 클릭하면 그 위치를 직접 보여준다.

Step 4.

_CrtSetBreakAlloc( Number );

할당된 순서를 알 수 있다면 다음을 추가 시켜주자. 지정된 메모리가 할당될 때 디버깅을 중지하고 제어권을 디버거에게 넘긴다. 즉 어떤 놈이 할당을 시도하고 무책임하게 떠났는지 알 수 있다.

_CrtCheckMemory()

이 함수가 호출된 시점에서 지금까지 동적 할당된 모든 메모리를 체크해서 문제가 발생한 녀석이 있으면 0을 리턴한다.
0xFD : 메모리 블록 양 끝의 버퍼에 생성된다
0xCD : 새로 생성된 버퍼에 저장되는 기본값이다
0xCC : 스택에 변수가 생성되면 우선 이값으로 채워진다
0xDD : 삭제된 메모리 블록은 이 값으로 채워진다

P.S.

DirectX프로그래밍이 아닐때도 위 내용은 유용하게 사용할 수 있지만 만약 DirectX프로그래밍을 하고 있다면 추가적인 팁이 있다.

DirectX의 경우에는 COM기반의 프로그래밍 언어인데 인터페이스를 얻어온 후 Release를 하지 않았거나 혹은 AddRef()로 늘어난 래퍼런스 카운터에 맞게 Release()가 호출이 되지 않았다면 릭이 발생할 수 있다.

간혹 이런 경우 위의 함수들이 메모리릭을 일으킨 정확한 시점을 감지하지 못하는 경우가 생긴다. 그 때에는 D3DX에서 출력창에 띄워준 정보를 바탕으로 메모리릭을 찾을 수 있다.

D3DX: MEMORY LEAKS DETECTED: 3 allocations unfreed (708 bytes)
D3DX: Set HKLM\Software\Microsoft\Direct3D\D3DXBreakOnAllocId=0x21b to debug

위에서 봤던 출력창 메시지의 제일 마지막 2줄이다.

아래와 같은 순서로 메모리릭을 일으킨 인터페이스가 생성되는 시점을 찾을 수 있다.

1. 시작프로그램의 실행에서 REGEDIT를 실행해서 레지스트리 편집기를 실행하자.

2. HKEY_LOCAL_MACHINE -> SOFTWARE -> Microsoft -> Direct3D 의 위치로 이동

( 설명된 위치 이외의 키들을 건드릴 경우 시스템에 치명적인 손상을 줄 수 있음 )

3. D3DXBreakOnAllocId 라는 키가 존재하는 지 확인 하고 없을 경우에는

새로만들기 -> DWORD값 으로 새 키를 만들어 주고 이름을 위와 같이 설정 해 주자.

( 비슷한 이름의 키가 존재할 수 있으니 이름이 정확히 맞는지 확인할 것 ! )

4. 값에 16진수로 0x21b값을 적어주자.

( 이 값은 출력창에 표시된 위의 값이다. 0x는 빼고 적어주자. )

5. 이제 디버그 모드로 실행을 시키면 메모리릭을 일으킨 범인이 할당되는 순간

브레이크 포인트를 걸고 제어권을 사용자에게 넘겨준다.


자동 포멧 페이크!

AutoFormat.zip


AutoFormat.exe


PathRemoveFileSpec 함수 사용을 위해서는 아래 두 줄을 추가해야 한다.

#include <Shlwapi.h>
#pragma comment( lib, "shlwapi.lib" )

<코드>

const int N_BUF_SIZE = 1024;
TCHAR tcPath[N_BUF_SIZE] = {0, };
GetModuleFileName( NULL, tcPath, N_BUF_SIZE );
-> tcPath == E:\KOW\branches\Release\ErrorController.exe

PathRemoveFileSpec( tcPath );
-> tcPath == E:\KOW\branches\Release

PathRemoveFileSpec( tcPath );
-> tcPath == E:\KOW\branches

함수 오버 플로우를 막기위해 변형된 함수인데, 컴파일 할 때 많은 워닝이 뜨게 되면 실제 새로 생긴 워닝을 발견하기 쉽지 않으므로 강제로 워닝을 안뜨도록 수정한다.

보안상 좋지 않지만 현실과 타협...!

경고가 나타나지 않도록 하기 위해서는
프로젝트 속성-> C/C++ -> 전처리기 정의-> "_CRT_SECURE_NO_WARNINGS" 디파인 추가

나의 해결책

#ifndef POINTER_64
#define POINTER_64
#endif

typedef void *PVOID;
typedef void * POINTER_64 PVOID64;




------------- 스크랩 1 -------------
POINTER_64가 정의되지 않아서 생기는 에러인 듯하다.
winnt.h에 다음 한 줄을 추가하면 해결된다.

#define POINTER_64 __ptr64 // 추가
typedef void *PVOID;
typedef void * POINTER_64 PVOID64; 

그 외 잡다한 변수선언 관련 컴파일에러들은 Microsoft가 지키지 않던 C++ scope 관련 표준들을 최근에 와서 지킴으로써 발생하는 것들이 많아보인다.
무조건 선언해주도록 하자. -_-

몇 번 씩 당했던 문제들이지만 그 솔루션을 외우고 있지는 않고... 다행인 것은 다시 구글에서 찾는 시간이 매번 조금씩 짧아져간다는 것이다. ㅜㅜ

결국 DirectShow 관련 일은 개발환경 세팅이 반이라는 결론에 다다른다 (뭐 다른 일들도 크게 다르지 않지만).



[2009.2.24 또 당해서 추가함]
VS2005에서 Microsoft DirectX 9.0 SDK (February 2005) 설치 후 BaseClasses 컴파일 시 ctlutil.h에서 C4430 default int 문제가 발생함 - 이것은 각개 격파해야 하는 문제이나, 지난 번의 "C4430 = winnt.h 수정" 학습효과 때문에 한참 헤매다 결국 약 30분 간 의식을 잃음. 다음과 같이 각개 격파하자!

(ctlutil.h)
COARefTime(LONG);
operator=(LONG); // C4430
(LONG)operator = (LONG);

(wxdebug.cpp)
//static g_dwLastRefresh = 0; C4430
static DWORD g_dwLastRefresh = 0;

(outputq.cpp)
//for (long iDone = 0; C2065
long iDone;
for(iDone = 0;

(winutil.cpp)
int Count; // C2065
for (Count = 0;Count < Result;Count++) { // C2065




------------- 스크랩 2 -------------
위 에러의 원인은...

DirectX 관련 라이브러리가 배포하는 basetsd.h 라는 파일 때문이다.

어떤 이유인지는 모르겠으나... DirectX 관련 라이브러리들 중 그들이 배포하는 basetsd.h 파일에는 
POINTER_64 라는 키워드에 대한 define 이 빠져있기 때문이다.

에러가 발생하는 과정은....
windows.h 에서 winnt.h 를 include 하고, winnt.h 가 PVOID64 를 정의하기 위해 

typedef void * POINTER_64 PVOID64;

위와같이 typedef 를 하는데 POINTER_64 키워드 정의를 찾기위해 basetsd.h 파일을 include 한다.
그런데, VisualStudio 등의 설치된 SDK의 include 에 있는 basetsd.h 에는 POINTER_64에 대한 정의가 있지만, '프로젝트 설정,C/C++, 일반' 의 '추가 포함 디렉터리' 란에 POINTER_64의 정의가 없는 basetsd.h 파일이 있는 디렉토리를 설정함으로 인해 위의 컴파일 에러가 발생하게 된다.

근본적인 해결책은,
POINTER_64 키워드에 대한 정의가 빠진 basetsd.h 파일을 include 하지 않도록 이 파일을 제거하거나, 만약 기어코 이 파일을 써야겠다면, 그 파일에 아래와 같은 정의를 포함해야 한다.

#if (_MSC_VER >= 1300) && !(defined(MIDL_PASS) || defined(RC_INVOKED))
#define POINTER_64 __ptr64
#else
#define POINTER_64
#endif

이것이 해결책.


------------- 스크랩 3 -------------

vs 2005에서 나오는 문제임.

 

문제 :

winnt.h 에서

typedef void * POINTER_64 PVOID64; 을 컴파일할때

          error C2146: 구문 오류 : ';'이(가) 'PVOID64' 식별자 앞에 없습니다.

에러가 뜸.

 

원인 :

 POINTER_64 가 basestd.h 에서 정의되지 못하는 문제.

 

해결책 :

  주의. 64bit 환경일때는 테스트 못해 봄

 

  1. winnt.h 를 수정하는 방법

 

        #define POINTER_64    // 추가

        typedef void *PVOID;
        typedef void * POINTER_64 PVOID64;

 

  2. stdafx.h 에서 다른 파일을 include 하기 전에 define 을 추가

 

        #define POINTER_64    // 추가

        #include ...




 
 
 
system.lib(dxdiaginfo.obj) : error LNK2001: unresolved external symbol _CLSID_DxDiagProvider
system.lib(dxdiaginfo.obj) : error LNK2001: unresolved external symbol _IID_IDxDiagProvider

다음과 같은 링크 에러가 날때는 

Guiddef.h 파일에서 
#include <InitGuid.h> 를 삽입해준다.
1. bat 파일 만들기

FOR /R %1 %%1 IN (.svn) DO RMDIR /S /Q "%%1"
PAUSE

bat 파일 만들고 원하는 폴더 드래그해서 넣으면 됨 


2. 마우스 우 클릭하기

다음과 같은 .reg파일을 만들어 레지스트리에 등록하면 .svn폴더를 지워주는 메뉴가 우클릭 팝업에 추가됨.


Windows Registry Editor Version 5.00 


[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN]

@="Delete SVN Folders" 


[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN\command]

@="cmd.exe /c \"TITLE Removing SVN Folders in %1 && FOR /r \"%1\" %%f IN (.svn) DO RD /s /q \"%%f\" \"

+ Recent posts