Создать новый объект C ++ по определенному адресу памяти? - PullRequest
35 голосов
/ 12 октября 2009

Возможно ли в C ++ создать новый объект в определенной ячейке памяти? У меня есть блок разделяемой памяти, в котором я хотел бы создать объект. Возможно ли это?

Ответы [ 5 ]

60 голосов
/ 12 октября 2009

Вы хотите размещение new () . Он в основном вызывает конструктор, используя блок существующей памяти вместо выделения новой памяти из кучи.

Редактировать: убедитесь, что вы понимаете примечание об ответственности за явный вызов деструктора для объектов, созданных с использованием размещения new(), прежде чем использовать его!

12 голосов
/ 12 октября 2009

Да.Вам необходимо использовать вариант размещения оператора new ().Например:

void *pData = ....; // memory segment having enough space to store A object
A *pA = new (pData) A;

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

1 голос
/ 13 октября 2009

Если вы хотите выделить много мелкозернистых объектов, лучшим подходом будет использование размещения new в сочетании с кольцевым буфером. в противном случае вам придется отслеживать указатели отдельно от самих указателей объектов.

0 голосов
/ 14 сентября 2018

Предполагая, что у вас есть указатель на область памяти, в которую вы хотите поместить объект, я полагаю, что можно привести указатель к новому типу, а затем поместить объект в местоположение этого указателя. Это решение, которое не требует new ().

Учитывая вашу память:

// you would use the pointer you have to your allocation of memory char* mem_start = new char[1024]; // Now we have 1024 bytes to play with

Можно привести его к данному типу:

CustomType* object_ptr = (CustomType*) mem_start;

Наконец, вы можете построить там объект:

*(object_ptr) = CustomType();

0 голосов
/ 27 февраля 2017

В Windows MapViewOfFileEx и VirtualAllocEx позволяют указать предпочтительный виртуальный адрес. Хотя никаких гарантий.

...