_CrtSetAllocHook
將用戶端定義的配置函式連結到 C 執行階段偵錯記憶體配置處理序,以進行安裝 (僅限偵錯版本)。
語法
_CRT_ALLOC_HOOK _CrtSetAllocHook(
_CRT_ALLOC_HOOK allocHook
);
參數
allocHook
要連結到 C 執行階段偵錯記憶體配置處理序之新的用戶端定義配置函式。
傳回值
傳回先前定義的配置攔截函式;如果 allocHook
為 NULL
,則為 NULL
。
備註
_CrtSetAllocHook
可讓應用程式將自己的配置函式連結到 C 執行階段偵錯程式庫記憶體配置處理序。 因此,每次呼叫偵錯配置函式以配置、重新配置或釋放記憶體區塊,都會觸發對應用程式攔截函式的呼叫。 _CrtSetAllocHook
提供應用程式一個簡單的方法,以測試應用程式如何處理記憶體不足的情況、檢查配置模式的能力,以及記錄配置資訊以供稍後分析的機會。 若未定義 _DEBUG
,將會在前置處理期間移除對 _CrtSetAllocHook
的呼叫。
_CrtSetAllocHook
函式會安裝 allocHook
中指定的新用戶端定義配置函式,並傳回先前定義的攔截函式。 下列範例示範用戶端定義的配置攔截程序應如何設計原型:
int YourAllocHook( int allocType, void *userData, size_t size,
int blockType, long requestNumber,
const unsigned char *filename, int lineNumber);
自 allocType
變數會指定觸發對配置攔截函式呼叫的配置作業類型(_HOOK_ALLOC
、 _HOOK_REALLOC
和 _HOOK_FREE
)。 當觸發的配置類型是 _HOOK_FREE
時,userData
是即將要釋放之記憶體區塊的使用者資料區段指標。 不過,當觸發配置類型為 _HOOK_ALLOC
或 _HOOK_REALLOC
userData
時,是因為NULL
記憶體區塊尚未配置。
size
指定記憶體區塊的大小 (以位元組為單位),blockType
表示記憶體區塊的類型,requestNumber
是記憶體區塊的物件配置順序編號,而 filename
和 lineNumber
(如果有) 指定起始觸發之配置作業的原始程式檔名和行號。
攔截函式完成處理之後,必須傳回布林值,以指示主要 C 執行階段配置處理序如何繼續執行。 當攔截函式希望主要配置程式繼續時,如同從未呼叫攔截函式一樣,則攔截函式應該會傳回 TRUE
,這會導致執行原始觸發配置作業。 攔截函式可以收集並儲存配置資訊以供稍後分析,而不會干擾偵錯堆積目前的配置作業或狀態。
如果攔截函式想要讓主要配置處理序以呼叫觸發之配置作業但失敗的方式繼續執行,則攔截函式應傳回 FALSE
。 攔截函式可以模擬各種不同的記憶體狀況和偵錯堆積狀態,以測試應用程式如何處理每個情況。
若要清除攔截函式,請將 NULL
傳遞至 _CrtSetAllocHook
。
如需如何 _CrtSetAllocHook
與其他記憶體管理功能搭配使用,或如何撰寫您自己的用戶端定義攔截函式的詳細資訊,請參閱 偵錯攔截函式撰寫。
注意
_CrtSetAllocHook
在 /clr:pure 下不支援 。 /clr:pure 和 /clr:safe 編譯程式選項在 Visual Studio 2015 中已被取代,並在 Visual Studio 2017 中移除。
需求
常式 | 必要的標頭 |
---|---|
_CrtSetAllocHook |
<crtdbg.h> |
如需相容性詳細資訊,請參閱相容性。
程式庫
僅限偵錯版本的 C 執行階段程式庫。
範例
如需如何使用 _CrtSetAllocHook
的範例,請參閱 crt_dbg2
。