new – operátor (C++)

Přiděluje paměť pro objekt nebo pole objektů type-name z volného úložiště a vrací vhodně typovaný nenulový ukazatel na objekt.

[!POZNÁMKA]

Rozšíření komponenty Microsoft C++ poskytuje podporu pro klíčová slova new umožňující přidat položky vtable slot.Další informace naleznete v tématu new (nový slot v tabulce vtable) (rozšíření komponent C++)

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

Poznámky

Pokud není úspěšné, new vrátí hodnotu 0 a vyvolá výjimku. Viz Operátory new a delete pro další informace.Můžete změnit toto výchozí chování psaní vlastních rutin zpracování výjimek a volání funkce běhové knihovny _set_new_handler s názvem funkce jako jeho argumentem.

Informace o tom, jak vytvořit objekt na spravované haldě, naleznete v části gcnew.

Pokud je použito new pro přidělení paměti pro objekt třídy jazyka C++, objekt konstruktoru je volán po přidělení paměti.

Použijte operátor delete pro přidělení paměti s operátorem nové.

V následujícím příkladu je přiděleno a poté uvolněno dvourozměrné pole znaků velikost dim 10.Při přidělování multidimenzionálního pole musí všechny dimenze s výjimkou první být konstantní výrazy, které vedou k pozitivním hodnotám; levé pole dimenze může být libovolný výraz, který je vyhodnocen jako kladná hodnota.Při přidělování pole pomocí operátoru nové může být, první dimenze může být nula operátor – nové vrací jedinečný ukazatel.

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

Název typu nemůže obsahovat const, volatile, deklarace tříd nebo deklarace výčtů.Proto je neplatný následující výraz:

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

Operátor new nepřidělí odkazové typy, protože nejsou objekty.

Operátor new nelze použít k přidělení funkce, ale lze ho použít k přidělení ukazatele na funkce.V následujícím příkladu se přiděluje a poté uvolní pole sedmi ukazatelů na funkce, které vrací celá čísla.

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

Pokud použijete operátor new bez jakýchkoli dalších argumentů a kompilujete s možností /GX, /EHa, nebo /EHs, kompilátor vygeneruje kód pro volání operátoru delete, pokud konstruktor vyvolá výjimku.

Následující seznam popisuje gramatické prvky parametru new:

  • umístění
    Poskytuje způsob předání dalších argumentů, pokud přetížíte parametr new.

  • type-name
    Určuje typ, který má být přidělen. Může se jednat buď o vestavěný nebo uživatelem definovaný typ.Pokud je specifikace typu složitá, může být uzavřen v závorkách k vynucení pořadí vazeb.

  • Inicializátor
    Poskytuje hodnotu pro inicializaci objektu.Inicializátory nelze zadat pro pole.Operátor new operátor vytvoří pole objektů pouze v případě, že třída nemá výchozí konstruktor.

Příklad

Následující příklad kódu přiřazuje pole znaků a objekt ke třídě CName a poté je uvolní.

// 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;
}

Používáte-li formu new umístění operátoru new, formu s argumenty kromě velikosti alokace, kompilátor nepodporuje formu umístění operátoru delete, pokud konstruktor vyvolá výjimku.Příklad:

// 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;
}

Viz také

Referenční dokumentace

Výrazy s unárními operátory

Klíčová slova jazyka C++

Doba platnosti objektů, kterým je přiřazen výraz new.

Inicializace objektů, kterým je přiřazen výraz new.

Jak funguje výraz new.

operator new – funkce