110 likes | 225 Vues
This guide provides an in-depth exploration of memory management techniques in Windows C++ utilizing the C Run-Time (CRT) library. It covers the debug heap functions designed to catch memory leaks, track allocation state using linked lists, and configure error reporting methods with assert mechanisms. Learn how to utilize the Debug Heap to identify memory issues, and get details on hooking functions for enhanced error handling. Additionally, this resource explains the differences between console and Windows applications, as well as optimizing file I/O functions.
E N D
C Run-time (CRT) topics Mahmoud SalehWindows C++ Team
Help with memory leaks • CRT Debug heap • Debug only, default in debug apps • Allocates slightly larger blocks of memory • Keeps track of memory state (through a linked list) • Uses buffers on both sides of user data • NoMansLand: 0xfd • New memory: 0xcd • Free’d memory: 0xdd
Help with memory leaks • How to use Debug Heap to find memory leaks • Check state • Dump memory leaks
Help with memory leaks • Debug heap state and functions are debug only! • What about release? • Track allocations • Even new operator goes through malloc(), and delete calls free() • Break at free and malloc • Other options: • _heapwalk • Application Verifier (with Debugging Tools for Windows) • …
Help with unhandled exceptions • terminate() • set_terminate() • Handler must exit; otherwise abort will be called • Don’t throw in the handler!
Assert and error reporting • Asserts (DEBUG only) are very useful in C++ and C • Other error reporting types: _CRT_WARN _CRT_ERROR _CRT_ASSERT • 3 modes for reporting _CRTDBG_MODE_FILE _CRTDBG_MODE_DEBUG _CRTDBG_MODE_WNDW
Assert and error reporting • One step further, use a hook _CrtSetReportHook2 _CrtSetReportHookW2 Note: CrtSetReportHook2 and _CrtSetReportHookW2 let you hook or unhook a function, whereas _CrtSetReportHook only lets you hook a function. • Make sure to properly terminate the app, if you don’t want the CRT default handlers to kick off
CRT entry points • Linker defined, based on /SUBSYSTEM • Windows apps (/SUBSYSTEM:WINDOWS) • (w)WinMain (called by WinMainCRTStartup) • Console apps (/SUBSYSTEM:CONSOLE) • (w)main (called by mainCRTStartup) • DllMain (/DLL) • _DllMainCRTStartup initializes the C run-time library then calls DllMain • If /DLL or /SUBSYSTEM not specified, linker selects subsystem and entry point based on whether main or WinMain is defined. • Or, define your entry point: /ENTRY
CRT support for Unicode, SBCS, MBCS • Recommended: Use Unicode, unless there’s a specific reason not to. • Windows APIs use Unicode • In the CRT, if you want to change the character set: • Project properties: • Or, explicitly define _UNICODE or _MBCS before including <tchar.h> (or using /D compiler switch)
Optimizing File IO in CRT • Buffered vs. low level IO functions • fopen (CRT buffered) • open (low level) • Setting buffer size • Default is is 0x1000 (4K) • setvbuf • Sometimes, buffering may result in perf reduction: use with caution!