_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

Rutinitas debug