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

Это UB для повторного использования хранилища объектов, не уничтожая его в первую очередь?

Данный тип не-POD T:

auto p = new T();
::new (p) T();
/* ... */
delete p;

Это UB, правильно?

Понятно, что я непосредственно не утечка памяти, выделенной для этой первой T (и если у нее нет косвенных членов, то я вообще ничего не пропадаю), но она никогда не разрушалась, что мне кажется великий кандидат на спонтанное уничтожение галактик, населенных разумными кошачьими существами.

Благодаря @Xeo для, гм, "вдохновляющий" этот вопрос в Lounge С++.

4b9b3361

Ответ 1

Это скорее зависит.

[C++11: 3.8/1]: Время жизни объекта типа T заканчивается, когда:

  • Если T - это тип класса с нетривиальным деструктором (12.4), начинается вызов деструктора или
  • хранилище, которое объект занимает, повторно используется или освобождается.

Ясно, что это случай повторного использования.

и

[C++11: 3.8/4]: Программа может завершить время жизни любого объекта за счет повторного использования хранилища, которое объект занимает, или путем явного вызова деструктора для объекта типа класса с нетривиальным деструктором. Для объекта типа класса с нетривиальным деструктором программа не требует прямого вызова деструктора до того, как хранилище, которое объект занимает, повторно используется или освобождается; , однако, если нет явного вызова деструктора или если выражение удаления (5.3.5) не используется для освобождения хранилища, деструктор не должен быть неявно вызван, и любая программа, зависящая от полученных побочных эффектов по деструктору имеет поведение undefined.

Таким образом, даже для типа, отличного от POD T, он действителен, если ничто в вашей программе не зависело от того, что делал деструктор.

Это немного воздушно-фея, но это потенциально позволяет делать то, что вы делаете.


Обратите внимание, что эта снисходительность не распространяется на некоторые лишь несколько более странные случаи:

[C++11: 3.8/9]: создание нового объекта в месте хранения, в котором используется объект const со статической, потоковой или автоматической продолжительностью хранения, или, в месте хранения, в котором такой объект const, который был занят до его окончания жизни, заканчивается результатами undefined поведение