Aracılığıyla paylaş


_set_new_handler

Varsa, hata işleme mekanizmasını aktarır Denetim new operator başarısız bellek ayrılamadı.

_PNH _set_new_handler(
   _PNH pNewHandler 
);

Parametreler

  • pNewHandler
    Uygulama tarafından sağlanan bellek işleme için işaretçi.Bağımsız değişken 0 kaldırılacak yeni işleyicisi neden olur.

Dönüş Değeri

Önceki özel durum işleme işlevi tarafından kaydedilen bir işaretçi döndürür _set_new_handler, böylece önceki işlev daha sonra geri.Önceki bir işlev kümesi, dönüş değeri varsayılan davranışını geri yüklemek için kullanılabilir; Bu değer olabilir NULL.

Notlar

C++ _set_new_handler işlevi belirtir, Denetim kazançları bir özel durum işleme işlevi new operator başarısız bellek ayrılamadı.new Başarısız, çalışma zamanı sistemi otomatik olarak bir bağımsız değişken olarak geçirilen özel durum işleme işlevi çağıran _set_new_handler._PNH, New.h içinde tanımlanan, bir işaretçi türünü döndüren bir işlev olan int türünde bir bağımsız değişken alır ve size_t.Use size_t ayrılacak alan miktarını belirtmek için.

Varsayılan işleyici yok olur.

_set_new_handleraslında bir çöp toplama düzeni olur.Çalışma zamanı sistemi yeniden deneme ayırma her zaman işlevinizde sıfır olmayan bir değer verir ve kendi işlevi 0 değerini döndürür, başarısız olur.

Bir örneğini _set_new_handler işlevini bir programda çalışma zamanı sistemi ile bağımsız değişken listesinde belirtilen özel durum işleme işlevini kaydeder:

#include <new.h>
int handle_program_memory_depletion( size_t )
{
   // Your code
}
int main( void )
{
   _set_new_handler( handle_program_memory_depletion );
   int *pi = new int[BIG_NUMBER];
}

Son geçildi işlev adresi kaydedebilirsiniz _set_new_handler çalışması ve daha sonra yeniden:

_PNH old_handler = _set_new_handler( my_handler );
   // Code that requires my_handler
   _set_new_handler( old_handler )
   // Code that requires old_handler

C++ _set_new_mode işlevi yeni işleyicisi modunu ayarlar malloc.Yeni işleyicisi modu gösterir mi, başarısızlık, malloc tarafından belirlenen yeni işleyici yordamı çağırmak için ise _set_new_handler.Varsayılan olarak, malloc yeni bir işleyici yordamı bellek ayırma hatası çağırmaz.Bu varsayılan davranışı geçersiz kılmak böylece, malloc bellek ayırma işlemi malloc aynı şekilde yeni bir işleyici yordamı çağırır bu yolla new operatörü mü aynı nedenle başarısız olduğunda.Varsayılan geçersiz kılmak için arayın:

_set_new_mode(1)

erken, program veya bağlantı ile Newmode.obj.

Kullanıcı tanımlı, operator newyeni işleyicisi işlevler otomatik olarak arıza olarak değil, sağlanır.

Daha fazla bilgi için bkz: Yeni ve silmek , C++ dil başvurusu.

Tek bir var. _set_new_handler işleyicisi dinamik olarak bağlı tüm dll dosyaları veya yürütülebilir dosyaları; çağırdığınız bile _set_new_handler sizin işleyicisi tarafından başka bir yerini veya başka bir dll veya yürütülebilir bir işleyici değiştirdiğiniz.

Gereksinimler

Yordamı

Gerekli başlık

_set_new_handler

<new.h>

Daha fazla uyumluluk bilgileri için bkz: Uyumluluk giriş.

Örnek

Bu örnekte, ayırma başarısız olduğunda denetim için MyNewHandler transfer edilir.MyNewHandler'için geçirilen bağımsız değişken istenen bayt sayısıdır.MyNewHandler döndürülen değeri ayırma Denenen olup olmadığını gösteren bir iþarettir: ayırma Denenen ve sıfır değerini ayırma başarısız olduğunu bildiren sıfır olmayan bir değer gösterir.

// crt_set_new_handler.cpp
// compile with: /c
#include <stdio.h>
#include <new.h>
#define BIG_NUMBER 0x1fffffff

int coalesced = 0;

int CoalesceHeap()
{
   coalesced = 1;  // Flag RecurseAlloc to stop 
   // do some work to free memory
   return 0;
}
// Define a function to be called if new fails to allocate memory.
int MyNewHandler( size_t size )
{
   printf("Allocation failed. Coalescing heap.\n");

   // Call a function to recover some heap space.
   return CoalesceHeap();
}

int RecurseAlloc() {
   int *pi = new int[BIG_NUMBER];
   if (!coalesced)
      RecurseAlloc();
   return 0;
}

int main()
{
   // Set the failure handler for new to be MyNewHandler.
   _set_new_handler( MyNewHandler );
   RecurseAlloc();
}
  
  
  
  

.NET Framework Eşdeğeri

Yoktur. Standart c işlevi çağırmak için kullanmak PInvoke. Daha fazla bilgi için bkz: Platform Çağırma örnekleri.

Ayrıca bkz.

Başvuru

Bellek ayırma

calloc

free

realloc