_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 FALSE
dö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.