Создание экземпляра из буфера пустого указателя - PullRequest
4 голосов
/ 18 декабря 2009

Вот некоторый код 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;
}

В коде больше вещей, но в этом суть.

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

Спасибо.

EDIT: исправлена ​​утечка памяти.

Ответы [ 7 ]

11 голосов
/ 18 декабря 2009

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

Редактировать: более полезная ссылка

5 голосов
/ 18 декабря 2009

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

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

2 голосов
/ 18 декабря 2009

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

2 голосов
/ 18 декабря 2009

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

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

1 голос
/ 18 декабря 2009

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

0 голосов
/ 19 декабря 2009

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

0 голосов
/ 18 декабря 2009

Поиск в Google для "размещения новых".

...