2013-05-23 3 views
1

Я встретился с некоторыми кодами, как показано ниже.Странное использование ключевого слова C++ для нового

char *buffer = new char[sizeof(PoolThread) * numThreads]; 
m_threads = reinterpret_cast<PoolThread*>(buffer); 
for (int i = 0; i < numThreads; i++) 
{ 
    new (buffer)PoolThread(*this); 
    buffer += sizeof(PoolThread); 
} 

Я думаю new здесь для инициализации пустого пространства памяти, на которое указывает m_threads к реальному объекту (от PoolThread класса)

Я гугле, но только нашли Infos от использования new как это:

pointer = new somthing[number]; 

Я надеюсь, что больше информации о использовании new в моем верхнем примере кода. И используется ли это из стандарта C++?

+0

См. [«Что используется для« размещения нового »? »] (http://stackoverflow.com/questions/222557/what-uses-are-there-for-placement-new). – kay

+0

Да, я задаю двойной вопрос. Я выберу ответ гейта через 7 минут –

+0

Да, мой вопрос повторяется с этим. –

ответ

7

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

В коде, который вы отправили, адрес buffer используется для указания того, где будет выделен элемент (на самом деле он изменен так, что каждое последовательное распределение следует по адресу).

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