配置攔截和 C 執行階段記憶體配置
如果呼叫任何配置內部記憶體的 C 執行階段程式庫函式,配置攔截函式上非常重要的限制是必須明確地忽略 _CRT_BLOCK 區塊 (由 C 執行階段程式庫函式所做的內部記憶體配置)。 在配置攔截函式的開頭包含有像下列的程式碼可以忽略 _CRT_BLOCK 區塊:
if ( nBlockUse == _CRT_BLOCK )
return( TRUE );
如果配置攔截沒有忽略 _CRT_BLOCK 區塊,那麼攔截裡的任何 C 執行階段程式庫函式可以捕捉無窮迴圈裡的程式。 例如,printf 會執行內部配置。 如果攔截程式碼呼叫 printf,那麼產生的配置會再次呼叫攔截,來再次呼叫 printf ,直到堆疊溢位 (Stack Overflow)。 如果您要報告 _CRT_BLOCK 配置操作,避開這種限制的一種方法是使用 Windows API 函式,而不是執行階段函式來執行格式化和輸出。 因為 Windows API 不會使用 C 執行階段程式庫堆積,它們不會在無窮迴圈裡捕捉配置攔截。
如果檢查執行階段程式庫原始程式檔,您會看到預設的 CrtDefaultAllocHook 配置攔截函式 (只簡單傳回 TRUE) 位於本身不同的 DBGHOOK.C 檔案內。 如果您要針對在應用程式 main 函式之前執行之執行階段起始程式碼的配置進行呼叫配置攔截,則您可以使用自己的攔截而不使用 _CrtSetAllocHook 來取代這個預設函式。