Nazywa się placement new. Wywołuje konstruktor w określonej pamięci, a nie przydziela nową pamięć. Zauważ, że w tym przypadku musisz jawnie wywołać destruktor obiektu przed zwolnieniem przydzielonej pamięci.
Wyjaśnienie. Załóżmy, że przydzielono pewną ilość pamięci pierwotnej i chcesz skonstruować obiekt w tej pamięci. Nazywasz
new(rawMemory) Object(params);
Teraz przed uwalniając pamięć
delete [] rawMemory;
trzeba będzie wezwać derstuctor Object wyraźnie
reinterpret_cast<Object*>(rawMemory)->~Object();
W danym przykładzie, jednak potencjalny problem jest że nie zniszczyłeś prawidłowo istniejącego obiektu przed zbudowaniem nowego w jego pamięci.
Bonus: kiedykolwiek zastanawialiście się, jak standardowy std::vector
można zrobić bez jego obiektów są zawarte default-constructible? Powodem jest to, że w większości, jeśli nie we wszystkich, implementacjach allocator<T>
nie zapisuje się T* p
, co wymagałoby domyślnej konstrukcji T w przypadku p = new T[N]
. Zamiast tego przechowuje wskaźnik char
- pamięć pierwotną i przydziela p = new char[N*sizeof(T)]
. Gdy obiekt jest push_back
, po prostu wywołuje konstruktora kopiowania z nowym położeniem na odpowiednim adresie w tablicy char.
Odkładając na bok istniejące odpowiedzi: składnia w * tytule * twojego pytania nie istnieje! Nie możesz używać tej składni z żadną wartością, możesz po prostu użyć jej w wywołaniu konstruktora - tzn. 'Wartość' musi mieć postać' T (argumenty) '. –
nowe miejsce docelowe zawsze używane w puli pamięci C++ (pula obiektów). jako dodatkową odpowiedź. – Healer