Wpis z mikrobloga

@Analityk: BTW
data[i] = T();
to nie jest wywołanie konstruktora dla obiektu data[i] tylko operator= z domyślnie skonstruowanym argumentem.
Tobie pewnie chodziło o tak zwany placement new, czyli

new (data+i) T;
  • Odpowiedz
@lionbest: Działam na systemie, w którym nie ma new. Jak sobie poradzić? Myślałem, że wywołuję konstruktor. Powinienem zrobić tak samo z tym konstruktorem jak w destruktorze? Czyli

data[i].T::T();
?
Edit: ale to nie działa.
  • Odpowiedz
@Analityk: No cóż wymyślili taką składnię z operatorem new żeby się nie myliło i chyba żeby nie wywołać omyłkowo na już stworzonym obiekcie. Po za tym chyba nie musi być zaimplementowane new żeby używać placement new.
Po za tym trochę źle ci dałem radę, bo ten operator może przesunąć adres, czyli:
char* data = ...;
T* t = new (data) T;
I tutaj niema jakiejś obligacji że (char*)t == data
  • Odpowiedz
@lionbest: Co w takim razie robi data[i] = T(); ?
Rozmiar wszystkich obiektów w szablonie array znany jest w czasie kompilacji, to znaczy wystarczy płytki konstruktor kopiujący by skopiować zawartość całego obiektu. Dlatego sądziłem, że skoro tak wywołam konstruktor to skonstruowany obiekt umieści pod wskazanym adresem i wszystko będzie ok. Domyślny konstruktor (lub raczej bezparametrowy) mi w zupełności wystarcza, chodzi o wyzerowanie pamięci pól obiektu, czego malloc nie potrafi.
  • Odpowiedz