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
Doba platnosti objektů, kterým je přiřazen výraz new.