_CrtIsValidHeapPointer
Memverifikasi bahwa pointer tertentu berada dalam timbunan yang dialokasikan oleh beberapa pustaka run-time C, tetapi belum tentu oleh pustaka CRT pemanggil. Dalam versi CRT sebelum Visual Studio 2010, fungsi ini memverifikasi bahwa pointer yang ditentukan berada di timbunan lokal (hanya versi debug).
Sintaks
int _CrtIsValidHeapPointer(
const void *userData
);
Parameter
userData
Penunjuk ke awal blok memori yang dialokasikan.
Nilai hasil
_CrtIsValidHeapPointer
mengembalikan TRUE
jika pointer yang ditentukan berada di tumpukan yang dibagikan oleh semua instans pustaka CRT. Dalam versi CRT sebelum Visual Studio 2010, fungsi ini mengembalikan TRUE
jika pointer yang ditentukan berada di timbunan lokal. Sebaliknya, fungsi ini akan menampilkan FALSE
.
Keterangan
Kami tidak menyarankan Anda menggunakan fungsi ini. Dimulai dengan pustaka CRT Visual Studio 2010, semua pustaka CRT berbagi satu tumpukan OS, timbunan proses. Fungsi melaporkan _CrtIsValidHeapPointer
apakah pointer dialokasikan dalam tumpukan CRT, tetapi tidak dialokasikan oleh pustaka CRT pemanggil. Misalnya, pertimbangkan blok yang dialokasikan dengan menggunakan versi Visual Studio 2010 dari pustaka CRT. Jika fungsi yang _CrtIsValidHeapPointer
diekspor oleh versi Visual Studio 2012 dari pustaka CRT menguji penunjuk, fungsi akan mengembalikan TRUE
. Pengujian ini tidak lagi berguna. Dalam versi pustaka CRT sebelum Visual Studio 2010, fungsi ini digunakan untuk memastikan bahwa alamat memori tertentu berada dalam timbunan lokal. Timbunan lokal mengacu pada tumpukan yang dibuat dan dikelola oleh instans tertentu dari pustaka run-time C. Jika pustaka tautan dinamis (DLL) berisi tautan statis ke pustaka run-time, pustaka ini memiliki instans sendiri dari timbunan run-time, dan oleh karena itu timbunannya sendiri, independen dari timbunan lokal aplikasi. Jika _DEBUG
tidak ditentukan, panggilan ke _CrtIsValidHeapPointer
akan dihapus selama praproscesing.
Karena fungsi ini mengembalikan TRUE
atau FALSE
, fungsi ini dapat diteruskan ke salah _ASSERT
satu makro untuk membuat mekanisme penanganan kesalahan debugging dasar. Contoh berikut menyebabkan kegagalan pernyataan jika alamat yang ditentukan tidak terletak di dalam timbunan lokal:
_ASSERTE( _CrtIsValidHeapPointer( userData ) );
Untuk informasi selengkapnya tentang bagaimana _CrtIsValidHeapPointer
dapat digunakan dengan fungsi debug dan makro lainnya, lihat Makro untuk pelaporan. Untuk informasi tentang bagaimana blok memori dialokasikan, diinisialisasi, dan dikelola dalam versi debug timbunan dasar, lihat detail timbunan debug CRT.
Persyaratan
Rutin | Header yang diperlukan |
---|---|
_CrtIsValidHeapPointer |
<crtdbg.h> |
Untuk informasi kompatibilitas selengkapnya, lihat Kompatibilitas.
Pustaka
Debug versi pustaka run-time C saja.
Contoh
Contoh berikut menunjukkan cara menguji apakah memori valid saat digunakan dengan pustaka run-time C sebelum Visual Studio 2010. Contoh ini disediakan untuk pengguna kode pustaka CRT warisan.
// crt_isvalid.c
// This program allocates a block of memory using _malloc_dbg
// and then tests the validity of this memory by calling
// _CrtIsMemoryBlock,_CrtIsValidPointer, and _CrtIsValidHeapPointer.
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <crtdbg.h>
#define TRUE 1
#define FALSE 0
int main( void )
{
char *my_pointer;
// Call _malloc_dbg to include the filename and line number
// of our allocation request in the header information
my_pointer = (char *)_malloc_dbg( sizeof(char) * 10,
_NORMAL_BLOCK, __FILE__, __LINE__ );
// Ensure that the memory got allocated correctly
_CrtIsMemoryBlock((const void *)my_pointer, sizeof(char) * 10,
NULL, NULL, NULL );
// Test for read/write accessibility
if (_CrtIsValidPointer((const void *)my_pointer,
sizeof(char) * 10, TRUE))
printf("my_pointer has read and write accessibility.\n");
else
printf("my_pointer only has read access.\n");
// Make sure my_pointer is within the local heap
if (_CrtIsValidHeapPointer((const void *)my_pointer))
printf("my_pointer is within the local heap.\n");
else
printf("my_pointer is not located within the local"
" heap.\n");
free(my_pointer);
}
my_pointer has read and write accessibility.
my_pointer is within the local heap.
Baca juga
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk