Jeśli alokowana pamięć jest klasą z konstruktorem, który robi coś pożytecznego, operator new wywoła ten konstruktor i pozostawi zainicjowany obiekt.
Ale jeśli przydzielasz POD lub coś, co nie ma konstruktora, który inicjuje stan obiektu, nie możesz przydzielić pamięci i zainicjować tej pamięci operatorem new w jednej operacji. Masz jednak kilka opcji:
1) Zamiast tego użyj zmiennej stosu. Możesz alokować i inicjalizować domyślne w jednym kroku, na przykład:
int vals[100] = {0}; // first element is a matter of style
2) użycie memset()
. Zwróć uwagę, że jeśli przydzielany obiekt nie jest POD , ustawienie go jest złym pomysłem. Jednym konkretnym przykładem jest to, że jeśli ustawisz klasę, która ma funkcje wirtualne, rozwalisz vtable i pozostawisz obiekt w stanie bezużytecznym.
3) Wiele systemów operacyjnych ma wywołania, które robią to, co chcesz - alokują na stercie i inicjalizują dane w czymś. Przykładem systemu Windows byłobyVirtualAlloc()
4) Zazwyczaj jest to najlepsza opcja. Unikaj konieczności samodzielnego zarządzania pamięcią. Możesz użyć kontenerów STL, aby zrobić wszystko, co zrobiłbyś z pamięcią surową, w tym alokować i inicjować wszystko za jednym zamachem:
std::vector<int> myInts(100, 0); // creates a vector of 100 ints, all set to zero