次の方法で共有


_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パラメーターと lineNumber パラメーターは、_expand_dbgが明示的に呼び出されているか、_CRTDBG_MAP_ALLOC プリプロセッサ定数が定義されている場合にのみ使用できます。

戻り値

正常に終了した場合、_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 デバッグ ヒープの詳細を参照してください。 割り当てブロックの種類とその使用方法については、「デバッグ ヒープ上のブロックの種類を参照してください。 標準ヒープ関数とデバッグ バージョンの違いについては、「 Debug バージョンのヒープ割り当て関数を参照してください。

この関数は、パラメーターを検証します。 userDataが null ポインターの場合、またはサイズが _HEAP_MAXREQ より大きい場合、この関数は無効なパラメーター ハンドラーを呼び出します(パラメーターの検証。 実行の継続が許可された場合、 errnoEINVAL に設定され、関数が NULLのセキュリティが強化されたバージョンです。

要件

ルーチンによって返される値 必須ヘッダー
_expand_dbg <crtdbg.h>

互換性の詳細については、「 Compatibility」を参照してください。

ライブラリ

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

コメント

このプログラムの出力は、すべてのセクションを拡張するためのコンピューターの能力によって異なります。 すべてのセクションが展開される場合、出力は出力セクションに反映されます。

関連項目

デバッグ ルーチン
_malloc_dbg