Reputation: 22162
C++17 (draft N4659) [basic.compound]/3 says:
Every value of pointer type is one of the following:
a pointer to an object or function (the pointer is said to point to the object or function), or
a pointer past the end of an object ([expr.add]), or
the null pointer value ([conv.ptr]) for that type, or
an invalid pointer value.
To which of these categories belong pointers to allocated memory outside the lifetime of objects, specifically the values of a
at // (1)
through // (3)
and b
at // (4)
in the following program?
#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);
}
In my understanding a pointer value becomes invalid when deallocated, not when the life time of an object ends, but if the pointer values are "pointer[s] to an object", to which object do they point?
Upvotes: 5
Views: 432
Reputation: 8298
All C++ standard are an abject mess when it comes to basic runtime concept.
What is an lvalue? It needs to be able to refer to a not yet created object. (Same for pointers.)
When do not created object exist? Do they appear just before they are needed?
To me the best approach would have been to assume all object types exist everywhere in memory where they fit. Many people here told me that was insane and contradictory yet no one ever pointed to a contradiction.
Upvotes: -4
Reputation: 3567
To which of these categories belong pointers to allocated memory outside the lifetime of objects, specifically the values of
a
at// (1)
through// (3)
andb
at// (4)
in the following program?
Pointer values returned from allocation functions (a
at // (1)
and b
at // (4)
) are not currently specified and it is barely possible to classify them according to the taxonomy in [basic.compound]/3, see https://groups.google.com/a/isocpp.org/d/msg/std-discussion/4NQawIytVzM/eMKo2AJ9BwAJ
In my understanding a pointer value becomes invalid when deallocated, not when the life time of an object ends, but if the pointer values are "pointer[s] to an object", to which object do they point?
To the object they pointed to when the object was alive.
Upvotes: 2