Aracılığıyla paylaş


Yeni işleç (C++)

Bir nesne veya nesneler dizisi için bellek ayırır türü adı ücretsiz depolamak ve nesneye uygun yazılı, sıfır olmayan bir işaretçi döndürür.

[::] new [placement] new-type-name [new-initializer]
[::] new [placement] ( type-name ) [new-initializer]

Notlar

Başarısız olursa, Yeni sıfır döndürür veya bir özel durum; Bkz: Yeni ve işleçler silmek daha fazla bilgi için. Bir özel durum işleme yordamına yazmak ve çağırmak bu varsayılan davranışı değiştirmek _set_new_handler , işlev adı bağımsız olarak çalışma zamanı kitaplığı işleviyle.

Yönetilen öbek üzerinde bir nesne oluşturma konusunda daha fazla bilgi için bkz: gcnew.

Zaman Yeni olan bir C++ sınıf nesnesi için bellek ayırmak için kullanılan bellek ayrıldıktan sonra nesnenin kurucusu çağrılır.

Kullanım silmek ile ayrılan bellek ayırması için operatör Yeni işleci.

Aşağıdaki örnek ayırır ve iki boyutlu bir dizi karakter boyutu boşaltır dim tarafından 10. Çok boyutlu bir dizi tahsis ederken, birinci hariç tüm boyutlarını değerlendirmek için pozitif değerler sabit deyimler olmalıdır; en soldaki dizi boyutu pozitif bir değere değerlendirilen herhangi bir ifade olabilir. Bir dizi kullanarak tahsis ederken Yeni işleci, ilk boyut sıfır olabilir — Yeni operatörü benzersiz bir işaretçi döndürür.

char (*pchar)[10] = new char[dim][10];
delete [] pchar;

Türü adı içeremez const, volatile, sınıf bildirimleri veya numaralandırma bildirimleri. Bu nedenle, aşağıdaki deyim geçersiz:

volatile char *vch = new volatile char[20];

Yeni operator ayrılamadı baþvuru türleri nesneler değildir çünkü.

Yeni bir işlev ayrılacak işleci kullanılamaz, ancak işaretçiler işlevlerine ayırmak için kullanılabilir. Aşağıdaki örnek ayırır ve bir dizi tamsayıların dönmek işlevleri için yedi işaretçiler serbest bırakır.

int (**p) () = new (int (*[7]) ());
delete *p;

İşlecini kullanırsanız, Yeni herhangi bir ek bağımsız değişkenler ve derleme ile olmadan /gx, /EHa, veya /EHs , derleyici Oluştur seçeneği işlecini çağırmak için kod silmek yapıcı bir özel durum oluşturursa.

Aşağıdaki listede dilbilgisi öğeleri açıklar Yeni:

  • yerleştirme
    Ek bağımsız değişkenler geçirerek, aşırı yükleme, bir yol sağlar Yeni.

  • Tür adı
    Tahsis edilecek türünü belirtir; Bu, yerleşik veya kullanıcı tanımlı türü olabilir. Tür belirtimi karmaşık ise, bağlama sırasını zorla parantezlerle çevrelenmiş.

  • Başlatıcı
    Başlatılmamış Nesne için bir değer sağlar. Başlatıcı diziler için belirtilemez. Yeni işleci yalnızca sınıfın varsayılan kurucu varsa nesne dizileri oluşturacaktır.

Örnek

Aşağıdaki kod örneği, bir karakter dizisi ve sınıfın bir nesnesi ayırır CName ve bunları boşaltı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;
}

Yerleştirme yeni biçimini kullanırsanız, Yeni işleci, bağımsız değişken boyutuna ek olarak form derleyici ayırma yerleştirme biçimi desteklemiyor silmek yapıcı bir özel durum oluşturursa işleci. Ö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

Tekli operatörler ifadelerle

C++ anahtar sözcükler

Yaşam ayrılmış nesnelerin yeni

Ayrılmış nesneleri ile yeni başlatma

Yeni Works

Operatör yeni işlev