Udostępnij za pośrednictwem


Jak działa słowo kluczowe new

allocation-expression — wyrażenie zawierające operator new — realizuje trzy funkcje:

  • Lokalizuje i rezerwuje pamięć dla obiektu lub obiektów, które mają zostać przedzielone.Po ukończeniu tego etapu, poprawna ilość pamięci jest przydzielana, ale nie jest jeszcze obiektem.

  • Inicjalizuje obiekt(y).Po zakończeniu inicjalizacji, wystarczająca ilość informacji jest obecna dla przydzielenia pamięci, która ma być obiektem.

  • Zwraca wskaźnik do obiektu(ów) typu wskaźnika pochodzącego z new-type-name lub type-name.Program używa tego wskaźnika do dostępu do nowo przydzielonego obiektu.

Operator new wywołuje funkcję operator new.Dla tablic dowolnego typu, i dla obiektów, które nie są typu class, struct lub union, funkcja globalna ::operator newjest wywoływana, aby przydzielić pamięć.Obiekty typu klasy mogą definiować własne statyczne funkcje członkowskie operator new na podstawie klasy.

Kiedy kompilator napotka operator new, aby zaalokować obiekt typu type, emituje wywołanie type**::operator new( sizeof(** type ) ) lub, jeśli nie istnieje zdefiniowany przez użytkownika operator new, ::operator new( sizeof( type ) ).W związku z tym operator new może alokować poprawną ilość pamięci dla obiektu.

[!UWAGA]

Argument operator new jest typu size_t.Ten typ jest zdefiniowany w DIRECT.H, MALLOC.H, MEMORY.H, SEARCH.H, STDDEF.H, STDIO.H, STDLIB.H, STRING.H i TIME.H.

Opcja w gramatyce pozwala specyfikację placement (zobacz Gramatyka dla Operator new).Parametr placement może być używany tylko dla implementacji użytkownika operator new; pozwala na przekazywanie dodatkowych informacji do operator new.Wyrażenie z polem placement, takie jak T *TObject = new ( 0x0040 ) T; jest tłumaczone na T *TObject = T::operator new( sizeof( T ), 0x0040 );, jeśli klasa T ma operator członkowski new, w przeciwnym razie na T *TObject = ::operator new( sizeof( T ), 0x0040 );.

Oryginalnym zamiarem pola Położenie było umożliwienie alokacji obiektów zależnych od sprzętu w określonym przez użytkownika adresie.

[!UWAGA]

Mimo że w poprzednim przykładzie pokazano tylko jeden argument w polu placement, nie ma żadnych ograniczeń ile dodatkowych argumentów można w ten sposób przekazać do operator new.

Nawet jeśli operator new został zdefiniowany dla typu klasy, globalny operator może być używany za pomocą formy w tym przykładzie:

T *TObject =::new TObject;

Operator rozpoznawania zakresu (::) wymusza użycie globalnego operatora new.

Zobacz też

Informacje

new — Operator (C++)