Это новое место размещения.
Хотя вы обычно его не используете с целочисленными типами.
Обычно оно используется для создания буфера, в который вы затем встраиваете другие типы.
// Allocate a buffer with enough room for two T objects.
char* buffer = new char[sizeof(T) * 2];
// Allocate a T in slot zero
T* t1 = new (buffer + 0 * sizeof(T)) T("Zero");
// Allocate a T in slot one
T* t2 = new (buffer + 1 * sizeof(T)) T("One");
Это основы.
Но помните, что объекты, выделенные с размещением new , не могут быть удалены с помощью оператора delete
.Это потому, что delete
пытается восстановить память, выделенную new
(а также вызвать деструктор).Поэтому, чтобы правильно использовать эти объекты, вы должны вручную вызвать там деструктор.
t1->~T();
t2->~T();
Не забудьте удалить исходный буфер.
delete [] buffer;
Несколько других предостережений:
Людичасто видят, что буфер может быть реализован в стеке и, таким образом, автоматически освобождается
char buffer[sizeof(T) * 2];
К сожалению, это может быть технически нормально (компилируется).Но работа не гарантируется, так как память буфера может быть неправильно выровнена для размещения Т внутри.Таким образом, вы должны динамически распределять буфер (с помощью нового он гарантирует, что память выровнена правильно для любого объекта выделенного размера (таким образом, путем расширения он также выравнивается для любого размера, меньшего, чем выделенный размер). Простой способ обойтиэта проблема заключается в использовании std :: vector
std::vector<char> buffer(sizeof(T) * 2);
T* t1 = new (&buffer[0] + 0 * sizeof(T)) T("Zero");
T* t2 = new (&buffer[0] + 1 * sizeof(T)) T("One");
Другое использование размещения new - сброс объекта.
Я видел, что это сделано, но я предпочитаю использовать более стандартный оператор присваивания:
T obj1("Plop");
obj1 = T("Another Plop");
// Can be done like this:
T obj1("Plop");
obj1.~T();
new (&obj1) T("Another Plop"); // Seems excessive to me. But can be us-full
// in some extreme situations.
Помните, что если вы используете метод сброса, вы должны сначала уничтожить старый объект (или объект может работать неправильно).