new İşleci (C++)
Kullanılabilir bellekten tür adı nesneleri veya nesneler dizisi için bellek ayırır ve nesneye uygun türde, sıfır olmayan bir işaretçi döndürür.
[!NOT]
Microsoft C++ Bileşen Uzantıları, vtable yuvası girişlerinin eklenebilmesi için new anahtar sözcüğü için destek sağlar.Daha fazla bilgi için, Yeni (yeni yuvasında vtable)
[::] new [placement] new-type-name [new-initializer]
[::] new [placement] ( type-name ) [new-initializer]
Notlar
İşlem başarısız olursa, new sıfır döndürür ve bir özel durum oluşturur; daha fazla bilgi için bkz. New ve delete İşleçleri.Bu varsayılan davranışı özel bir özel durum işleme yordamı yazarak ve _set_new_handler çalışma zamanı kitaplık işlevini bağımsız değişken olarak işlevinizi kullanıp çağırarak değiştirebilirsiniz.
Yönetilen yığında nesne oluşturma hakkında bilgi için bkz. gcnew.
Bir C++ sınıfı nesne için bellek atamak üzere new kullanıldığında nesnenin oluşturucusu bellek atandıktan sonra çağrılır.
delete işlecini kullanarak new işleciyle atanmış olan belleğin atamasını kaldırın.
Aşağıdaki örnek 10'a göre dim boyutunda karakterlerden oluşan iki boyutlu bir karakter dizisini ayırır ve ardından serbest bırakır.Çok boyutlu bir dizi tahsis ederken, ilki dışındaki tüm boyutlar, pozitif değerlere dönüşen sabit ifadeler olması gerekir; en soldaki dizi boyutu pozitif bir değer veren herhangi bir ifade olabilir.new işlecini kullanarak bir dizi tahsis ederken ilk boyut sıfır olabilir — new işleci benzersiz bir işaretçi döndürür.
char (*pchar)[10] = new char[dim][10];
delete [] pchar;
type-name; const, volatile, sınıf bildirimi veya numaralandırma bildirimi içeremez.Bu nedenle aşağıdaki ifade geçersizdir:
volatile char *vch = new volatile char[20];
New işleci, nesne olmadıklarından başvuru türlerini atamaz.
New işleci bir işlevi atamak için kullanılamaz ancak işlevlere belirticiler atamak için kullanılabilir.Aşağıdaki örnek, tamsayı döndüren işlevlere yedi işaretçiden oluşan bir dizi ayırır ve ardından serbest bırakır.
int (**p) () = new (int (*[7]) ());
delete *p;
Ek bağımsız değişken olmadan new işlecini kullanıyorsanız ve /GX, /EHa veya /EHs seçeneğiyle derleme yaparsanız, oluşturucunun bir özel durum oluşturması durumunda derleyici delete işlecini çağırmak için bir kod üretir.
Aşağıdaki liste, şu yenilerin dilbilgisi öğelerini açıklar:
yerleşim
new işlecini aşırı yüklediyseniz ek bağımsız değişkenleri iletmek için bir yol sağlar.tür-ad
Ayrılacak türü belirtir; bu yerleşik veya kullanıcı tanımlı bir tür olabilir.Tür belirtimi karmaşıksa, bağlama sırasının zorlanması için parantez içine alınır.başlatıcı
Başlatılan nesne için bir değer sağlar.Başlatıcılar diziler için belirtilemez.New işleci yalnızca sınıfın varsayılan bir oluşturucusu varsa nesne dizileri oluşturacaktır.
Örnek
Aşağıdaki kod örneği, bir karakter dizisi ve CName sınıfından bir nesneyi ayırır ve daha sonra serbest bırakır.
// expre_new_Operator.cpp
// compile with: /EHsc
#include <string.h>
class CName {
public:
enum {
sizeOfBuffer = 256
};
char m_szFirst[sizeOfBuffer];
char m_szLast[sizeOfBuffer];
public:
void SetName(char* pszFirst, char* pszLast) {
strcpy_s(m_szFirst, sizeOfBuffer, pszFirst);
strcpy_s(m_szLast, sizeOfBuffer, pszLast);
}
};
int main() {
// Allocate memory for the array
char* pCharArray = new char[CName::sizeOfBuffer];
strcpy_s(pCharArray, CName::sizeOfBuffer, "Array of characters");
// Deallocate memory for the array
delete [] pCharArray;
pCharArray = NULL;
// Allocate memory for the object
CName* pName = new CName;
pName->SetName("Firstname", "Lastname");
// Deallocate memory for the object
delete pName;
pName = NULL;
}
Atama boyutuna ek olarak new işlecinin yeni taşıma biçimini ve bağımsız değişken içeren biçimi kullanırsanız, oluşturucunun bir özel durum oluşturması durumunda derleyici delete işlecinin değiştirilmesini desteklemez.Örne?in:
// expre_new_Operator2.cpp
// C2660 expected
class A {
public:
A(int) { throw "Fail!"; }
};
void F(void) {
try {
// heap memory pointed to by pa1 will be deallocated
// by calling ::operator delete(void*).
A* pa1 = new A(10);
} catch (...) {
}
try {
// This will call ::operator new(size_t, char*, int).
// When A::A(int) does a throw, we should call
// ::operator delete(void*, char*, int) to deallocate
// the memory pointed to by pa2. Since
// ::operator delete(void*, char*, int) has not been implemented,
// memory will be leaked when the deallocation cannot occur.
A* pa2 = new(__FILE__, __LINE__) A(20);
} catch (...) {
}
}
int main() {
A a;
}
Ayrıca bkz.
Başvuru
new ile Ayrılmış Nesnelerin Ömrü