Явный вызов конструктора для объекта

303
15 декабря 2017, 03:40

Как создать объект в динамической памяти используя malloc()? Нужно ведь явно вызывать конструктор, как это сделать?

Answer 1

Вам нужен placement new.

Например, так:

void* place = malloc(sizeof(Object));
Object* o = new(place) Object();

Не забудьте в конце вызвать и деструктор вручную:

o->~Object();

и если нужно

free(place);

Документация: https://isocpp.org/wiki/faq/dtors#placement-new

Для случая, когда у вас память выделена заранее, вам придётся позаботиться о выравнивании. Обычный указатель, который возвращает malloc, имеет выравнивание, достаточное для нормально объявленного класса, то есть, класса, определение которого не содержит alignas() (а также определение классов его полей), и значит, ничего больше делать не нужно.

Если это (отсутствие alignas) не гарантировано, у вас есть два пути. Вы можете вместо malloc использовать aligned_alloc (или _aligned_malloc на старых версиях Visual Studio), который выдаёт malloc с нужным выравниванием:

void* place = std::aligned_alloc(alignof(Object), sizeof(Object));
void* place = _aligned_malloc(sizeof(Object), alignof(Object));

(да, порядок противоположный).

Или если вам нужен именно malloc, то можно заказать больше памяти для того, чтобы было место для выравнивания, и выровнять указатель при помощи std::align:

std::size_t alloc_size = sizeof(Object) + alignof(Object) - 1;
void* place = malloc(alloc_size);
void* aligned_place = place;
if (std::align(alignof(Object), sizeof(Object), aligned_place, alloc_size))
{
    Object* o = new(aligned_place) Object();
    // ...
}

Эта вторая техника пригодится, если вы захотите выделить в одном буфере несколько объектов.

READ ALSO
Проходят не все тесты c++

Проходят не все тесты c++

Нужно написать функцию, вычисляющую длину отрезка по координатам его концовС помощью этой функции вычислить периметр треугольника по координатам...

256
C++ Корневая (текущая) папка программы

C++ Корневая (текущая) папка программы

С++ Как задать корневую (текущую) папку для программы, например у меня есть параграмма с файлами картинками (ресурсы программы), но если я откраиваю...

452
Как обновить конкретную область на QGraphicsScene?

Как обновить конкретную область на QGraphicsScene?

Собственно, вопрос следующий: Есть у меня QGraphicsView у которого есть QGraphicsSceneДля QGraphicsScene установлен следующий режим:

289