指向对象生命周期之外已分配内存的指针是“无效指针[s]”还是“指向对象的指针[s]”?

wal*_*nut 5 c++ pointers language-lawyer c++17

C++17(草案 N4659)[basic.compound]/3说:

指针类型的每个值都是以下之一:

  • 指向对象或函数的指针(该指针被称为指向该对象或函数),或

  • 超过对象末尾的指针 ([expr.add]),或

  • 该类型的空指针值 ([conv.ptr]),或

  • 无效的指针值。

这些类别中的哪一个属于指向对象生命周期之外已分配内存的指针,特别是以下程序中aat // (1)through// (3)bat的值// (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);
}
Run Code Online (Sandbox Code Playgroud)

在我的理解中,指针值在解除分配时变得无效,而不是在对象的生命周期结束时,但如果指针值是“指向对象的指针”,它们指向哪个对象?

Lan*_*yer 2

指向对象生命周期之外分配的内存的指针属于这些类别中的哪一个,特别是以下程序中的aat // (1)through// (3)bat的值?// (4)

当前未指定从分配函数(aat// (1)bat // (4))返回的指针值,几乎不可能根据 [basic.compound]/3 中的分类法对它们进行分类,请参阅https://groups.google.com/a/isocpp .org/d/msg/std-discussion/4NQawIytVzM/eMKo2AJ9BwAJ

根据我的理解,指针值在释放时变得无效,而不是在对象的生命周期结束时,但如果指针值是“指向对象的指针”,它们指向哪个对象?

当对象还活着时,他们指向该对象。