该标准通过以下示例来演示指针在其指向的对象的生命周期结束后只能以有限的方式使用。但是,这是否意味着第一个对象的存储被重新使用,然后在使用新放置的情况下其生命周期结束?因为从概念上讲,B 最初占用的存储空间被 D 重新使用,这意味着整个 [basic#life-6] 不能应用于其示例。但看起来标准中存在一些漏洞,无法使下面的示例有效,这意味着必须在其生命周期结束之前进行重用。
[基础#life-6]
......
void B::mutate() {
new (this) D2; // reuses storage --- ends the lifetime of *this
f(); // undefined behavior
... = this; // OK, this points to valid memory
}
this
指针的生命周期结束后访问它。最初,
this
指针是B*
指针,但现在有一个D
对象占据了B*
指向的空间。换句话说,指向同一内存位置的 B*
指针不再有效,但指向该位置的 void*
仍然有效,因为它仍然是有效的内存位置。您可以通过转换指针类型来调用 D::f()
定义的行为:D* me = reinterpret_cast<D*>(this);
me.f();
但简单地调用
f()
根本不会在该
#mutate
函数的上下文中定义,因为 this
仍然是 B*
。