2013-09-24 2 views
0

(C++/Win32)динамического распределения C++ объекта без использования нового оператора

рассмотрит следующий вызов:

Object obj = new Object(a,b); 

другого, чем распределение виртуальной памяти, необходимую для экземпляра Object, что еще происходит под капотом? компилятор помещает явный вызов конструктору Object?

Есть ли способ инициализировать объект C++ динамически без использования ключевого слова new?

+3

Определите «динамический». '{Object obj {a, b}; } 'также выделяет объект и уничтожает его, без использования' new' или 'delete'. – WhozCraig

+0

И вы действительно должны объяснить, почему вы спрашиваете! Обратите внимание, что многие стандартные контейнеры строят объекты .... –

ответ

4

Если вы хотите, чтобы инициализировать объект в некоторой заданной зоне памяти, рассмотрит placement new (см this)

Кстати, обычный Object* n = new Object(123) выражения почти эквивалентно (см operator ::new)

void* p = malloc(sizeof(Object)); 
if (!p) throw std::bad_alloc; 
Object* n = new (p) Object(123); // placement new at p, 
            // so invokes the constructor 

Но реализация может использовать некоторые не- malloc совместимый распределитель, поэтому не смешивайте new и free!

1

Вы всегда можете использовать malloc вместо нового, но не забудьте всегда связывать его с free, а не delete.

Смотрите также: What is the difference between new/delete and malloc/free?

+1

Это не вызывает конструктор. –

+1

... или деструктор с 'free()' – WhozCraig

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