Aracılığıyla paylaş


_CrtIsValidHeapPointer

Belirtilen işaretçinin bir C çalışma zamanı kitaplığı tarafından ayrılmış bir yığında olduğunu doğrular, ancak çağıranın CRT kitaplığı tarafından ayrılmış olması gerekmez. Visual Studio 2010'dan önceki CRT sürümlerinde, bu işlev belirtilen işaretçinin yerel yığında olduğunu doğrular (yalnızca hata ayıklama sürümü).

Sözdizimi

int _CrtIsValidHeapPointer(
   const void *userData
);

Parametreler

userData
Ayrılmış bellek bloğunun başlangıcına yönelik işaretçi.

Dönüş değeri

_CrtIsValidHeapPointer , belirtilen işaretçi tüm CRT kitaplık örnekleri tarafından paylaşılan yığındaysa döndürür TRUE . Visual Studio 2010'un önceki CRT sürümlerinde, belirtilen işaretçi yerel yığındaysa bu işlev döndürür TRUE . Aksi takdirde işlevi döndürür FALSE.

Açıklamalar

Bu işlevi kullanmanızı önermiyoruz. Visual Studio 2010 CRT kitaplığından başlayarak, tüm CRT kitaplıkları işlem yığını olan bir işletim sistemi yığınını paylaşır. İşlev, _CrtIsValidHeapPointer işaretçinin bir CRT yığınında ayrılıp ayrılmadığını bildirir, ancak çağıranın CRT kitaplığı tarafından ayrılıp ayrılmadığını bildirir. Örneğin, CRT kitaplığının Visual Studio 2010 sürümü kullanılarak ayrılmış bir blok düşünün. CRT kitaplığının _CrtIsValidHeapPointer Visual Studio 2012 sürümü tarafından dışarı aktarılan işlev işaretçiyi test ederse döndürür TRUE. Bu test artık yararlı değildir. Visual Studio 2010'un önceki CRT kitaplığı sürümlerinde, belirli bir bellek adresinin yerel yığın içinde olduğundan emin olmak için işlev kullanılır. Yerel yığın, C çalışma zamanı kitaplığının belirli bir örneği tarafından oluşturulan ve yönetilen yığına başvurur. Dinamik bağlantı kitaplığı (DLL) çalışma zamanı kitaplığına statik bir bağlantı içeriyorsa, uygulamanın yerel yığınından bağımsız olarak kendi çalışma zamanı yığını örneğine ve dolayısıyla kendi yığınına sahiptir. Tanımlanmadığında _DEBUG , çağrısı _CrtIsValidHeapPointer ön işleme sırasında kaldırılır.

Bu işlev veya FALSEdöndürdüğündenTRUE, temel hata ayıklama hata işleme mekanizması oluşturmak için makrolardan birine _ASSERT geçirilebilir. Aşağıdaki örnek, belirtilen adres yerel yığında yer almıyorsa onay hatasına neden olur:

_ASSERTE( _CrtIsValidHeapPointer( userData ) );

Diğer hata ayıklama işlevleri ve makrolarla nasıl _CrtIsValidHeapPointer kullanabileceğinizle ilgili daha fazla bilgi için bkz . Raporlama için makrolar. Temel yığının hata ayıklama sürümünde bellek bloklarının nasıl ayrıldığı, başlatıldığı ve yönetildiğini öğrenmek için bkz . CRT hata ayıklama yığını ayrıntıları.

Gereksinimler

Yordam Gerekli başlık
_CrtIsValidHeapPointer <crtdbg.h>

Daha fazla uyumluluk bilgisi için bkz . Uyumluluk.

Kitaplıklar

Yalnızca C çalışma zamanı kitaplıklarının sürümlerinde hata ayıklama.

Örnek

Aşağıdaki örnek, Visual Studio 2010'un öncesinde C çalışma zamanı kitaplıklarıyla kullanıldığında belleğin geçerli olup olmadığının nasıl test edilemediğini gösterir. Bu örnek, eski CRT kitaplık kodu kullanıcıları için sağlanır.

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

Ayrıca bkz.

Hata ayıklama yordamları