оператор new — C ++ неинициализированный массив экземпляров классов

Я искал, но не мог найти ответ на это. Есть ли способ рассказать new оператор для не называть конструкторы классов?

MyObject* array = new MyObject[1000];

Это позвонит MyObject() тысячи раз! Я хочу заполнить выделенную память самостоятельно, и мне не нужна информация, инициализированная в конструкторе. С помощью malloc() не очень гармоничный код C ++ imho.

MyObject* array = (MyObject*) malloc(sizeof(MyObject) * 1000);

5

Решение

C ++ эквивалентно malloc функция распределения operator new, Вы можете использовать это так:

MyObject* array = static_cast<MyObject*>(::operator new(sizeof(MyObject) * 1000));

Затем вы можете сконструировать конкретный объект с размещением нового:

new (array + 0) MyObject();

замещать 0 с любым смещением, которое вы хотите инициализировать.

Однако мне интересно, действительно ли вы хотите сделать это динамическое распределение самостоятельно. Возможно std::map<int, MyObject> или же std::unordered_map<int, MyObject> подойдет вам лучше, так что вы можете создать MyObject по любому индексу.

std::unordered_map<int, MyObject> m;
m[100]; // Default construct MyObject with key 100
4

Другие решения

Действительно, использование malloc не очень гармонично с кодом C ++. Но malloc делает именно то, что вы просите. Поэтому я боюсь, что то, что вы просите, не очень гармонично с C ++. Я думаю, вы просто должны решить, какой язык вы бы предпочли программировать на C или C ++.

Я полагаю, что ваш единственный реальный вариант — переписать MyObject, чтобы у него не было конструкторов, но это не совсем C ++.

4

просто используйте std :: vector

std::vector<MyObject> v;

v.reserve(1000); // allocate raw memory
v.emplace_back(42); // construct in place

для произвольного доступа (это (в основном) то, что делает std :: vector внутри):

typedef std::aligned_storage<sizeof(MyObject), std::alignment_of<MyObject>::value>::type Storage;
MyObject* myObjects(reinterpret_cast<MyObject*>(new Storage[1000]));

new (myObjects + 42) MyObject(/* ? */); // placement new
(*(myObjects + 42)).~MyObject();
3

Вы рассчитали это? Это займет слишком много времени? Это происходит только один раз при выполнении вашей программы, как в начале? Сначала определите, что это на самом деле проблема.

Вам действительно нужно распределить 1000 объектов таким образом?

Кроме того, если конструкторы не будут вызваны, как объекты будут … построены?

0
По вопросам рекламы [email protected]