operator new İşlevi
Bir deyimi aşağıdaki gibi bir programda karşılaşıldığında, işlevine bir çağrı çeviren operator new:
Notlar
char *pch = new char[BUFFER_SIZE];
İstek için depolama, sıfır bayt ise Yeni işleç farklı bir nesneye bir işaretçi döndürür (yinelendiğini çağrıları Yeni işleç farklı işaretçiler döndüren).Yetersiz bellek ayırma isteği için ise Yeni işleç verir boş ya da bir istisna atar (bkz: Yeni ve işleçler Sil daha fazla bilgi için).
Bellek boşaltın ve ayırma yeniden deneme girişimleri bir yordam yazabilirsiniz; bkz: _set_new_handler daha fazla bilgi için.Kurtarma düzeni üzerinde daha fazla ayrıntı görmek için aşağıdaki konuya Yetersiz bellek koşulları işleme.
İki kapsamları için operator new işlevleri aşağıdaki tabloda açıklanmıştır.
Kapsam işleci için yeni işlevler
İşleç |
Kapsam |
---|---|
::operatör new |
Genel |
sınıf adı::operatör new |
Sınıf |
İlk bağımsız değişken için Yeni işleç türünde olmalıdır size_t (STDDEF içinde tanımlanan bir tür.H) ve dönüş türü olan her zaman void *.
Genel Yeni işleç işlevi adlı Yeni yerleşik türlerin ayırmak için kullanılan işleç, içermeyen nesne sınıfı türü kullanıcı tanımlı Yeni işleç işlevleri ve her tür diziler.Zaman Yeni işleci nesne sınıfı türü tahsis etmek için kullanılır burada bir Yeni işleç tanımlanır, o sınıfın Yeni işleç olarak adlandırılır.
Bir Yeni işleç bir sınıf genel gizleyen (bu nedenle, sanal olamaz) bir statik üye işlev için tanımlanmış işlev Yeni işleç nesnelerin sınıf türü işlev.Bir durumu düşünün nerede Yeni ayırır ve bellek belirli bir değeri ayarlamak için kullanılır:
// spec1_the_operator_new_function1.cpp
#include <malloc.h>
#include <memory.h>
class Blanks
{
public:
Blanks(){}
void *operator new( size_t stAllocateBlock, char chInit );
};
void *Blanks::operator new( size_t stAllocateBlock, char chInit )
{
void *pvTemp = malloc( stAllocateBlock );
if( pvTemp != 0 )
memset( pvTemp, chInit, stAllocateBlock );
return pvTemp;
}
// For discrete objects of type Blanks, the global operator new function
// is hidden. Therefore, the following code allocates an object of type
// Blanks and initializes it to 0xa5
int main()
{
Blanks *a5 = new(0xa5) Blanks;
return a5 != 0;
}
Parantez içinde sağlanan bağımsız değişken Yeni için geçirilen Blanks::operator new olarak chInit bağımsız değişkeni.Ancak, genel Yeni işleç işlevi gizli, neden bir hata oluşturmak için aşağıdaki kodu:
Blanks *SomeBlanks = new Blanks;
Visual C++ 5.0 ve önceki nonclass türleri ve tüm diziler (in oldukları bağımsız olarak sınıf türü) kullanılarak ayrılmış Yeni işleç her zaman kullanılan genel Yeni işleç işlev.
Visual C++ 5.0 ile başlayarak, derleyici dizi üyesi destekleyen Yeni ve Sil işleçleri sınıf bildirimi içinde.Örne?in:
// spec1_the_operator_new_function2.cpp
class MyClass
{
public:
void * operator new[] (size_t)
{
return 0;
}
void operator delete[] (void*)
{
}
};
int main()
{
MyClass *pMyClass = new MyClass[5];
delete [] pMyClass;
}