Как создать объект в динамической памяти используя malloc()? Нужно ведь явно вызывать конструктор, как это сделать?
Вам нужен 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();
// ...
}
Эта вторая техника пригодится, если вы захотите выделить в одном буфере несколько объектов.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Нужно написать функцию, вычисляющую длину отрезка по координатам его концовС помощью этой функции вычислить периметр треугольника по координатам...
С++ Как задать корневую (текущую) папку для программы, например у меня есть параграмма с файлами картинками (ресурсы программы), но если я откраиваю...
Собственно, вопрос следующий: Есть у меня QGraphicsView у которого есть QGraphicsSceneДля QGraphicsScene установлен следующий режим: