Если память, которую вы выделяете, является классом с конструктором, который делает что-то полезное, оператор new вызовет этот конструктор и оставит ваш объект инициализированным.
Но если вы выделяете POD или что-то, что не имеет конструктора, который инициализирует состояние объекта, то вы не можете выделить память и инициализировать эту память с помощью оператора new за одну операцию. Однако у вас есть несколько вариантов:
1) Вместо этого используйте переменную стека. Вы можете выделить и инициализировать по умолчанию за один шаг, например так:
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