Создание экземпляра структуры из буфера указателя void

Вот код на C++, который мне кажется забавным, но я знаю, что он работает.

Определена структура, и в программе мы выделяем память с помощью указателя void. Затем структура создается с использованием выделенного буфера.

Вот код

typedef struct{
 char buffer[1024];
} MyStruct

int main()
{
   MyStruct* mystruct_ptr = 0;

   void* ptr = malloc(sizeof(MyStruct));

   // This is the line that I don't understand
   mystruct_ptr = new (ptr) MyStruct();

   free(ptr);

   return 0;
}

В коде есть еще что-то, но это суть.

Я не тестировал этот код, но код, который я рассматриваю, очень хорошо протестирован и работает. Но как?

Спасибо.

РЕДАКТИРОВАТЬ: исправлена ​​​​эта утечка памяти.


person Mike    schedule 18.12.2009    source источник
comment
В показанном коде происходит утечка памяти — по-видимому, в полной программе это не проблема.   -  person Jonathan Leffler    schedule 18.12.2009


Ответы (7)


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

Изменить: более полезная ссылка

person KeatsPeeks    schedule 18.12.2009

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

Подробности уже были предоставлены на этом сайте.

person Drew Dormann    schedule 18.12.2009

Это новое размещение. Это говорит new о возврате определенного адреса вместо фактического выделения памяти. Но важно то, что он по-прежнему вызывает конструктор.

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

person R Samuel Klatchko    schedule 18.12.2009

Скотт Мейерс очень хорошо описывает эту технику в Эффективный C++.

person DanDan    schedule 18.12.2009

Эта конструкция является размещением нового. Вместо выделения памяти и вызова конструктора класса компилятор создает экземпляр в указанном месте памяти. Такой контроль над выделением и освобождением памяти чрезвычайно полезен при оптимизации долго работающих программ.

person William Bell    schedule 18.12.2009

Найдите в Google «размещение новое».

person florin    schedule 18.12.2009

Если вы поместите файл, прочитанный после malloc, но перед новым, вы будете делать обычное (но уродливое) Load-In-Place для создания предварительно инициализированных объектов C++ в сериализованном буфере.

person Adisak    schedule 18.12.2009