Sdílet prostřednictvím


Jak funguje výraz new.

Výraz přidělení - výraz obsahující operátor new - slouží ke třem věcem:

  • Vyhledá a alokuje úložiště pro objekt nebo objekty, které mají být alokovány.Po dokončení této fáze je alokován správný objem úložiště, ale není to ještě objekt.

  • Inicializuje objekt(y).Po dokončení inicializace je k dispozici dostatek informací pro alokované úložiště pro vytvoření objektu.

  • Vrací ukazatel na objekt(y) typu ukazatele odvozeného z nového názvu typu nebo z názvu typu.Program tento ukazatel používá pro přístup k nově alokovanému objektu.

Operátor new zavolá funkci operator new.Pro pole libovolného typu a pro objekty, které nejsou typu třída, struct nebo sjednocení, je pro alokování úložiště zavolán ::operátor new.Objekty typu třída mohou definovat svou vlastní funkci statického člena operator new na základě každé třídy.

Když kompilátor narazí na operátor new pro přidělení objektu typu type, vydává volání type**:: operator new ( sizeof(type) )** nebo, neexistuje-li uživatelem definovaný operator new, ::operator new( sizeof(type) ).Proto může operátor new alokovat správnou velikost paměti objektu.

[!POZNÁMKA]

Argument operator new je typu size_t.Tento typ je definován v DIRECT.H, MALLOC.H, MEMORY.H, SEARCH.H, STDDEF.H, STDIO.H, STDLIB.H, STRING.H a TIME.H.

Možnost v gramatice umožňuje volbu specifikace umístění (viz gramatika operátoru new).Parametr umístění lze použít pouze pro uživatelsky definované implementace operator new. Umožňuje předání dodatečných informací do operator new.Výraz s polem umístění, jako je T *TObject = new ( 0x0040 ) T;, je přeložen na T *TObject = T::operator new( sizeof( T ), 0x0040 );, má-li třída T členský operátor new, jinak je přeložen na T *TObject = ::operator new( sizeof( T ), 0x0040 );.

Původní záměr pole umístění byl objektům závislým na hardwaru umožnit alokování na uživatelem zadaných adresách.

[!POZNÁMKA]

Ačkoli předchozí příklad ukazuje pouze jeden argument pole umístění, neexistuje žádné omezení, kolik dalších argumentů lze tímto způsobem předat operator new.

I když byl operator new definován pro typ třídy, lze pomocí formuláře v tomto příkladu použít globální operátor:

T *TObject =::new TObject;

Operátor rozlišení oboru (::) vynutí použití globálního operátoru new.

Viz také

Referenční dokumentace

new – operátor (C++)