pizzas *poiter=&j;
new (poiter) pizzas;
Używasz tu placement new do utworzenia nowego obiektu dokładnie w miejscu obiektu j. Czyli faktycznie nadpisujesz obiekt którego pola wypełniałeś cin-em.
Niestety string w przeciwieństwie do intów nie zostaje wypisany na końcu programu.
Bo został nadpisany. Na jego miejscu powstał nowy string (stworzony z konstruktorem domyślnym, a więc pusty). Inty są poprawnie wypisywane,b o to typy podstawowe i nie mają własnego konstruktora (nadającego jakąś wartość "na start"), a klasie `pizza` też nie napisałeś żadnego konstruktora, więc pamięć w której są inty pozostaje nieruszona.
delete poiter;
Program ci się nie crashuje? Użyłeś placement new, a nie new. Tzn. nie zaalokowałeś pamięci na stercie, dlatego też nie potrzebujesz jej zwalniać. Nie możesz tak robić.
- new - prosisz system o dodatkową pamięć dla programu i tworzysz na niej obiekt
- placement new - podajesz konkretny adres pamięci i każesz stworzyć tam obiekt. Ofc to musi być adres pamięci należącej już do programu.
Nie wiem też czy poprawnie wykonuje tę część zadania "use new to allocate a structure instead of declaring a structure variable", ale to jedyne co mi przychodzi do głowy :)
Chodziło raczej o najzwyklejsze zaalokowanie obiektu za pomocą new:
pizzas *j = new pizzas;
// cin, cin, cin
delete j;
PS:
- Dlaczego 'pizzas'? (dlaczego liczba mnoga?)
- Zdajesz się nie zauważać literówki w kodzie, dlatego wypomne :P 'pointer' zamiast 'poiter' powinno być.