Подтвердить что ты не робот

Malloc и конструкторы

В отличие от новых и удаленных операторов malloc не вызывает конструктор при создании объекта. В этом случае мы должны создать объект, чтобы конструктор также вызывался.

4b9b3361

Ответ 1

Er... use new? Такой вопрос. Вы также можете вызвать конструктор явно, но там мало причин сделать это таким образом

Использование нового/удалить обычно:

A* a = new A();

delete a;

Вызов конструктора/деструктора явно ( "размещение нового" ):

A* a = (A*)malloc(sizeof(A));
new (a) A();

a->~A();
free(a);

Ответ 2

Синтаксис "размещение нового" можно использовать, если вам действительно нужно:

MyClassName* foo = new(pointer) MyClassName();

где pointer - указатель на выделенную ячейку памяти, достаточно большую для хранения экземпляра вашего объекта.

Ответ 3

Предпочитает new.

Но если по какой-то причине у вас сырая память, вы можете построить ее с помощью "размещения нового":

new (ptr) TYPE(args);

И поскольку вы не будете использовать delete, вам нужно будет вызвать деструктор напрямую:

ptr->~TYPE();

Ответ 4

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

Ответ 5

Используйте placement new. Совет удобен:

КОНСУЛЬТАЦИЯ: Не используйте это "новое место размещения", синтаксис, если вам не нужно. Используйте его только когда вы действительно заботитесь о том, чтобы объект размещается в определенном месте в Память. Например, когда ваш аппаратное обеспечение имеет таймер ввода-вывода с отображением памяти устройства, и вы хотите разместить часы объект в этой ячейке памяти.

Ответ 6

Вы неправильно понимаете, что делает malloc. malloc не создает объекты, он выделяет память. Поскольку он не создает объекты, нет объекта для вызова конструктора для создания.

Если вам нужно динамически создавать объект на С++, вам нужно использовать какую-то новую форму.

Ответ 7

class A
{
    public:
      A() { printf("Constructor of A"); }
};

int main()
{
   A* pA = (A*) malloc(sizeof(A));  // Construtor is not going to be called.

   __asm { MOV EAX, pA}             // Makes pA as "this" pointer in intel based s/m.

   A();                             // Calling constructor explicitly.

   return 0;
}