C ++ 17 (черновик N4659) [basic.compound] / 3 говорит:
Каждое значение типа указателя является одним из следующих:
указатель на объект или функцию (говорят, что указатель указывает на объект или функцию), или
указатель за концом объекта([expr.add]) или
значение нулевого указателя ([conv.ptr]) для этого типа, или
anневерное значение указателя.
К какой из этих категорий относятся указатели на выделенную память вне времени жизни объектов, в частности значения от a
в // (1)
до // (3)
и b
в // (4)
в следующей программе?
#include<new>
#include<algorithm>
struct S {
~S() { /* Non-trivial destructor */ }
};
struct T {
~T() { /* Non-trivial destructor */ }
};
int main() {
void* a = operator new(std::max(sizeof(S), sizeof(T)));
// (1)
a = new(a) S;
static_cast<S*>(a)->~S();
// (2)
a = new(a) T;
static_cast<T*>(a)->~T();
// (3)
operator delete(a);
void* b = operator new(42);
// (4)
operator delete(b);
}
В моем понимании значение указателя становится недействительным при освобождении, не когда время жизни объекта заканчивается, а если значения указателя равны " указатель [s] на объект", на , на какой объект они указывают?