2014-01-02 3 views
1

Что означает этот код? В соответствии с этим link нет способа передать указатель на новый оператор. оператор new здесь по умолчанию один, а не перегруженный. пожалуйста, помогитеПередающие указатели новому оператору

LPVOID m_Buffer; 
MyClass* mc = new(reinterpret_cast<void*>(m_Buffer)) MyClass; 
+0

Здесь будут драконы. Вы не хотите его использовать. – ScarletAmaranth

+0

Ваш цитируемый код очень опасен, так как он пытается сделать размещение новым с неинициализированным адресом. Это означает, что вы выполняете построение «MyClass» в случайном, потенциально нераспределенном адресе. – icabod

ответ

5

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

+0

Спасибо за ответ. Итак, что здесь делает 'reinterpret_cast'? – shan

+0

'reinterpret_cast' не снят (как и все стили C++). Компилятор проверяет, что тип, из которого выполняется бросок, и тип, на который делается ссылка, совместимы друг с другом. Если это не так, компиляция терпит неудачу. –

+0

@RemyLebeau, но он не установлен во время выполнения. Это то, что я имел в виду, извините. –

1

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

Пример (из Parashift C Справка ++):

#include <new>  // Must #include this to use "placement new" 
#include "Fred.h"  // Declaration of class Fred 

void someCode() 
{ 
    char memory[sizeof(Fred)];  // Line #1 
    void* place = memory;   // Line #2 

    Fred* f = new(place) Fred(); // Line #3 (see "DANGER" below) 
    // The pointers f and place will be equal 

    ... 
} 

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

+0

Вам не нужно присваивать 'memory' отдельной переменной void *, прежде чем передавать ее в' new() '. Вы можете передать 'memory' непосредственно в' new() ', поскольку все указатели неявно деградируют до' void * ':' Fred * f = new (memory) Fred(); ' –

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