Если выделяемая вами память является классом с конструктором, который делает что-то полезное, оператор new вызовет этот конструктор и оставит ваш объект инициализированным.
Но если вы выделяете POD или что-то, что не имеет конструктора, который инициализирует состояние объекта, то вы не можете выделить память и инициализировать эту память с помощью оператора new за одну операцию. Однако у вас есть несколько вариантов:
1) Вместо этого используйте переменную стека. Вы можете выделить и default-initialize за один шаг, например:
int vals[100] = {0}; // first element is a matter of style
2) использовать memset()
. Обратите внимание, что если объект, который вы выделяете, не является POD , memsetting это плохая идея. Один конкретный пример: если вы установили класс с виртуальными функциями, вы уничтожите виртуальную таблицу и оставите свой объект в непригодном для использования состоянии.
3) Многие операционные системы имеют вызовы, которые делают то, что вы хотите - выделить в кучу и инициализировать данные для чего-то. Пример Windows будет VirtualAlloc()
4) Обычно это лучший вариант. Избегайте необходимости самостоятельно управлять памятью. Вы можете использовать контейнеры STL для всего, что вы делаете с необработанной памятью, включая распределение и инициализацию всего одним махом:
std::vector<int> myInts(100, 0); // creates a vector of 100 ints, all set to zero