Given non-POD type T
:
auto p = new T();
::new (p) T();
/* ... */
delete p;
This is UB, right?
Clearly I\'m not directly le
It rather depends.
[C++11: 3.8/1]:
The lifetime of an object of typeT
ends when:
- if
T
is a class type with a non-trivial destructor (12.4), the destructor call starts, or- the storage which the object occupies is reused or released.
Clearly, this is a case of re-use.
And:
[C++11: 3.8/4]:
A program may end the lifetime of any object by reusing the storage which the object occupies or by explicitly calling the destructor for an object of a class type with a non-trivial destructor. For an object of a class type with a non-trivial destructor, the program is not required to call the destructor explicitly before the storage which the object occupies is reused or released; however, if there is no explicit call to the destructor or if a delete-expression (5.3.5) is not used to release the storage, the destructor shall not be implicitly called and any program that depends on the side effects produced by the destructor has undefined behavior.
So, even for a non-POD type T
, it's valid iff nothing in your program actually relied on what the destructor was doing.
It's a bit airy-fairy, but it does potentially allow what you're doing.
Note that this leniency does not extend to some only slightly more bizarre cases:
[C++11: 3.8/9]
: Creating a new object at the storage location that a const object with static, thread, or automatic storage duration occupies or, at the storage location that such a const object used to occupy before its lifetime ended results in undefined behavior