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)
在我的理解中,指针值在解除分配时变得无效,而不是在对象的生命周期结束时,但如果指针值是“指向对象的指针”,它们指向哪个对象?
指向对象生命周期之外分配的内存的指针属于这些类别中的哪一个,特别是以下程序中的
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
根据我的理解,指针值在释放时变得无效,而不是在对象的生命周期结束时,但如果指针值是“指向对象的指针”,它们指向哪个对象?
当对象还活着时,他们指向该对象。