配置攔截函式
這個主題適用於:
版本 |
Visual Basic |
C# |
F# |
C++ |
Web Developer |
---|---|---|---|---|---|
Express |
僅適用原生 |
||||
Pro、Premium 和 Ultimate |
僅適用原生 |
使用 _CrtSetAllocHook 安裝的配置攔截函式會在每次記憶體配置、重新配置或釋放時呼叫。 這種類型的攔截 (Hook) 可以用於許多不同的用途。 例如,可以使用它來測試應用程式處理記憶體不足的方式、檢查配置模式或記錄供稍後分析的配置資訊。
注意事項 |
---|
請留意在配置攔截函式中使用 C 執行階段程式庫功能的相關限制,如配置攔截和 C 執行階段記憶體配置所述。 |
配置攔截函式應該有像下列的原型:
int YourAllocHook(int nAllocType, void *pvData,
size_t nSize, int nBlockUse, long lRequest,
const unsigned char * szFileName, int nLine )
您傳入至 _CrtSetAllocHook 的指標是在 CRTDBG.H 裡 _CRT_ALLOC_HOOK 定義的類型:
typedef int (__cdecl * _CRT_ALLOC_HOOK)
(int, void *, size_t, int, long, const unsigned char *, int);
當執行階段程式庫呼叫攔截函式時,nAllocType 引數表示要執行的配置操作 (_HOOK_ALLOC、_HOOK_REALLOC 或 _HOOK_FREE)。 在釋放或重新配置的情況裡,pvData 包含即將要釋放的使用者區塊主題指標。 然而,在配置時,這個指標是 Null,因為還沒發生配置。 其餘的引數包含問題裡配置的大小、區塊類型、相關的要求順序編號,如果有的話,也包含指向執行配置時的檔名和行號的指標。 攔截函式在執行任何作者所要求的分析或其他工作之後,必須傳回 TRUE (表示配置操作可以繼續) 或 FALSE (表示操作應該會失敗)。 這種類型的簡單攔截可能會檢查截至目前為止所配置的記憶體數量,並在總數量超過小型限制時傳回 FALSE。 然後應用程式會經歷只有在可用記憶體非常低時才會發生的配置錯誤。 更複雜的攔截可能會追蹤配置模式、分析記憶體使用或在特定情況發生時報告。