_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.