Malloc и конструкторы - PullRequest
       1

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

27 голосов
/ 08 июня 2010

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

Ответы [ 7 ]

68 голосов
/ 08 июня 2010

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

Используя new / delete обычно:

A* a = new A();

delete a;

Явный вызов конструктора / деструктора ( «размещение нового» * ​​1008 *):

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

a->~A();
free(a);
15 голосов
/ 08 июня 2010

Вы можете использовать синтаксис "размещения нового", чтобы сделать это, если вам действительно нужно:

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

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

4 голосов
/ 08 июня 2010

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

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

4 голосов
/ 08 июня 2010

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

СОВЕТ: не используйте это "новое место размещения" синтаксис, если вам не нужно. Используйте это только когда вы действительно заботитесь о том, что объект находится в определенном месте в объем памяти. Например, когда ваш аппаратное обеспечение имеет таймер ввода-вывода с отображением в память устройство, и вы хотите разместить часы объект в этом месте памяти.

4 голосов
/ 08 июня 2010

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

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

new (ptr) TYPE(args);

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

ptr->~TYPE();
3 голосов
/ 08 июня 2010

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

0 голосов
/ 11 октября 2011
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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...