_expand_dbg
以展開或收縮區塊的方式調整堆積中的指定記憶體區塊 (僅限偵錯版本)。
語法
void *_expand_dbg(
void *userData,
size_t newSize,
int blockType,
const char *filename,
int lineNumber
);
參數
userData
之前配置的記憶體區塊的指標。
newSize
要求的新區塊大小 (以位元組為單位)。
blockType
已調整大小區塊的要求類型︰_CLIENT_BLOCK
或 _NORMAL_BLOCK
。
filename
要求展開作業的來源檔案名稱指標,或為 NULL
。
lineNumber
要求展開作業的來源檔案行號,或為 NULL
。
filename
只有在明確呼叫 或_CRTDBG_MAP_ALLOC
定義預處理器常數時_expand_dbg
,才能使用 和 lineNumber
參數。
傳回值
成功完成時,_expand_dbg
會傳回已調整大小的記憶體區塊指標。 因為記憶體未移動,因此位址與userData相同。 如果發生錯誤或區塊無法擴充至要求的大小,則會傳 NULL
回 。 如果失敗,errno
會伴隨作業系統有關失敗類別的資訊。 如需 的詳細資訊errno
,請參閱errno
、 _doserrno
_sys_errlist
和 _sys_nerr
。
備註
函 _expand_dbg
式是 _expand
函式的偵錯版本。 未定義 時 _DEBUG
,對的每個呼叫 _expand_dbg
都會縮減為 對 _expand
的呼叫。 _expand
和 _expand_dbg
都會調整基底堆積的記憶體區塊大小,但 _expand_dbg
還容納數種偵錯功能:在區塊的使用者部分的任一端使用緩衝區以測試遺漏,以及追蹤特定配置類型的區塊類型參數,還有判斷配置要求來源的 filename
/lineNumber
資訊。
_expand_dbg
會使用比要求的 newSize
稍多一些的空間調整指定的記憶體區塊大小。 newSize
可能會比原始配置的記憶體區塊大小更多或更少。 偵錯堆積管理員會使用額外的空間來連結偵錯記憶體區塊,並提供偵錯標頭資訊和覆寫緩衝區的應用程式。 展開或收縮原始記憶體區塊即可調整大小。 _expand_dbg
不會移動記憶體區塊,函式也 _realloc_dbg
一樣。
當 newSize
大於原始區塊大小時,就會展開記憶體區塊。 在擴充期間,如果無法擴充記憶體區塊以容納所要求的大小, NULL
則會傳回 。 當 newSize
小於原時區塊大小時,記憶體區塊會收縮至取得新的大小。
如需如何在基底堆積偵錯版本中配置、初始化及管理記憶體區塊的相關信息,請參閱 CRT 偵錯堆積詳細數據。 如需配置區塊類型及其使用方式的相關信息,請參閱 偵錯堆積上的區塊類型。 如需有關標準堆積函式與偵錯版本差異的資訊,請參閱 堆積配置函式的偵錯版本。
這個函式會驗證它的參數。 如果 userData
是 Null 指標,或 size 大於 _HEAP_MAXREQ
,則此函式會叫用無效的參數處理程式,如參數驗證中所述。 若允許繼續執行, errno
會設為 EINVAL
,且函式會傳回 NULL
中所述。
需求
常式 | 必要的標頭 |
---|---|
_expand_dbg |
<crtdbg.h> |
如需相容性詳細資訊,請參閱相容性。
程式庫
僅限偵錯版本的 C 執行階段程式庫。
範例
// crt_expand_dbg.c
//
// This program allocates a block of memory using _malloc_dbg
// and then calls _msize_dbg to display the size of that block.
// Next, it uses _expand_dbg to expand the amount of
// memory used by the buffer and then calls _msize_dbg again to
// display the new amount of memory allocated to the buffer.
//
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <crtdbg.h>
int main( void )
{
long *buffer;
size_t size;
// Call _malloc_dbg to include the filename and line number
// of our allocation request in the header
buffer = (long *)_malloc_dbg( 40 * sizeof(long),
_NORMAL_BLOCK, __FILE__, __LINE__ );
if( buffer == NULL )
exit( 1 );
// Get the size of the buffer by calling _msize_dbg
size = _msize_dbg( buffer, _NORMAL_BLOCK );
printf( "Size of block after _malloc_dbg of 40 longs: %u\n", size );
// Expand the buffer using _expand_dbg and show the new size
buffer = (long *)_expand_dbg( buffer, size + sizeof(long),
_NORMAL_BLOCK, __FILE__, __LINE__ );
if( buffer == NULL )
exit( 1 );
size = _msize_dbg( buffer, _NORMAL_BLOCK );
printf( "Size of block after _expand_dbg of 1 more long: %u\n",
size );
free( buffer );
exit( 0 );
}
Size of block after _malloc_dbg of 40 longs: 160
Size of block after _expand_dbg of 1 more long: 164
註解
此程式的輸出取決於您的電腦能否展開所有區段。 如果所有區段都能展開,就會在 [輸出] 區段反映輸出。