_expand_dbg

Mengubah ukuran blok memori yang ditentukan dalam tumpukan dengan memperluas atau mengontrak blok (hanya versi debug).

Sintaks

void *_expand_dbg(
   void *userData,
   size_t newSize,
   int blockType,
   const char *filename,
   int lineNumber
);

Parameter

userData
Penunjuk ke blok memori yang dialokasikan sebelumnya.

newSize
Meminta ukuran baru untuk blok (dalam byte).

blockType
Jenis yang diminta untuk blok yang diubah ukurannya: _CLIENT_BLOCK atau _NORMAL_BLOCK.

filename
Penunjuk ke nama file sumber yang meminta operasi perluas atau NULL.

lineNumber
Nomor baris dalam file sumber tempat operasi perluas diminta atau NULL.

Parameter filename dan lineNumber hanya tersedia ketika _expand_dbg telah dipanggil secara eksplisit atau _CRTDBG_MAP_ALLOC konstanta pra-prosesor telah ditentukan.

Nilai hasil

Setelah berhasil diselesaikan, _expand_dbg mengembalikan penunjuk ke blok memori yang diubah ukurannya. Karena memori tidak dipindahkan, alamatnya sama dengan userData. Jika terjadi kesalahan atau blok tidak dapat diperluas ke ukuran yang diminta, maka akan mengembalikan NULL. Jika kegagalan terjadi, errno adalah dengan informasi dari sistem operasi tentang sifat kegagalan. Untuk informasi selengkapnya tentang errno, lihat errno, , _sys_errlist_doserrno, dan _sys_nerr.

Keterangan

Fungsi ini _expand_dbg adalah versi debug dari fungsi _expand . Ketika _DEBUG tidak ditentukan, setiap panggilan ke _expand_dbg dikurangi menjadi panggilan ke _expand. Baik _expand dan _expand_dbg mengubah ukuran blok memori di tumpukan dasar, tetapi _expand_dbg mengakomodasi beberapa fitur penelusuran kesalahan: buffer di kedua sisi bagian pengguna blok untuk menguji kebocoran, parameter jenis blok untuk melacak jenis alokasi tertentu, dan filename/lineNumber informasi untuk menentukan asal permintaan alokasi.

_expand_dbg mengubah ukuran blok memori yang ditentukan dengan sedikit lebih banyak ruang daripada yang diminta newSize. newSize mungkin lebih besar atau kurang dari ukuran blok memori yang dialokasikan awalnya. Ruang ekstra digunakan oleh manajer timbunan debug untuk menautkan blok memori debug dan untuk menyediakan aplikasi dengan informasi header debug dan menimpa buffer. Pengubahan ukuran dilakukan dengan memperluas atau mengontrak blok memori asli. _expand_dbg tidak memindahkan blok memori, seperti halnya _realloc_dbg fungsi.

Ketika newSize lebih besar dari ukuran blok asli, blok memori diperluas. Selama ekspansi, jika blok memori tidak dapat diperluas untuk mengakomodasi ukuran yang diminta, NULL dikembalikan. Ketika newSize kurang dari ukuran blok asli, blok memori dikontrak hingga ukuran baru diperoleh.

Untuk informasi tentang bagaimana blok memori dialokasikan, diinisialisasi, dan dikelola dalam versi debug timbunan dasar, lihat detail timbunan debug CRT. Untuk informasi tentang jenis blok alokasi dan cara penggunaannya, lihat Jenis blok pada tumpukan debug. Untuk informasi tentang perbedaan antara fungsi timbunan standar dan versi debug, lihat Versi debug fungsi alokasi timbunan.

Fungsi ini memvalidasi parameternya. Jika userData adalah penunjuk null, atau jika ukuran lebih besar dari _HEAP_MAXREQ, fungsi ini memanggil handler parameter yang tidak valid, seperti yang dijelaskan dalam Validasi parameter. Jika eksekusi diizinkan untuk melanjutkan, errno diatur ke EINVAL dan fungsi mengembalikan NULL.

Persyaratan

Rutin Header yang diperlukan
_expand_dbg <crtdbg.h>

Untuk informasi kompatibilitas selengkapnya, lihat Kompatibilitas.

Pustaka

Debug versi pustaka run-time C saja.

Contoh

// 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

Komentar

Output program ini tergantung pada kemampuan komputer Anda untuk memperluas semua bagian. Jika semua bagian diperluas, output tercermin di bagian Output.

Baca juga

Rutinitas debug
_malloc_dbg