指向对象生存期之外的已分配内存的指针是"invalid pointer[s]"还是"pointer[s] to an object"?

Are pointers to allocated memory outside object's lifetime "invalid pointer[s]" or "pointer[s] to an object"?

本文关键字:pointer invalid 还是 object an to 生存期 对象 指针 内存 分配      更新时间:2023-10-16

C++17(草案N4659([碱性化合物]/3说:

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

  • 指向对象或函数的指针(据说指针指向对象或功能(,或

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

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

  • 无效的指针值。

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

#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);
}

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

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

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

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

指向对象处于活动状态时所指向的对象。

当涉及到基本的运行时概念时,所有C++标准都是一个糟糕的烂摊子

什么是左值?它需要能够引用尚未创建的对象。(指针也是如此。(

未创建的对象何时存在?它们会在需要之前出现吗?

对我来说,最好的方法是假设所有对象类型都存在于内存中适合它们的位置这里的许多人告诉我,这是疯狂和矛盾的,但从来没有人指出矛盾。