哪个先发生,存储重复使用还是新放置的生命周期结束?

问题描述 投票:0回答:1

该标准通过以下示例来演示指针在其指向的对象的生命周期结束后只能以有限的方式使用。但是,这是否意味着第一个对象的存储被重新使用,然后在使用新放置的情况下其生命周期结束?因为从概念上讲,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 }


c++ object language-lawyer lifetime
1个回答
0
投票
this

指针的生命周期结束后访问它。最初,

this
指针是
B*
指针,但现在有一个
D
对象占据了
B*
指向的空间。换句话说,指向同一内存位置的
B*
指针不再有效,但指向该位置的
void*
仍然有效,因为它仍然是有效的内存位置。您可以通过转换指针类型来调用
D::f()
定义的行为:
D* me = reinterpret_cast<D*>(this);
me.f();

但简单地调用 
f()

根本不会在该

#mutate
函数的上下文中定义,因为
this
仍然是
B*
    

© www.soinside.com 2019 - 2024. All rights reserved.