2009-12-18 5 views
4

Вот код C++, который выглядит мне смешно, но я знаю, что он работает.Создание экземпляра из буфера указателей void

Существует определенная структура, и в программе мы выделяем память с помощью указателя 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: Исправлена ​​утечка памяти.

+1

Показанный код показывает утечку памяти - предположительно, это не проблема в полной программе. –

ответ

0

Поиск в Google для «размещения нового».

11

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

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

2

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

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

5

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

Детали уже обеспечены on this site.

1

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

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^