在basic.life C++ 标准的一部分,可以找到以下内容(强调我的):
The lifetime of an object o of type T ends when:
if T is a class type with a non-trivial destructor ([class.dtor]), the destructor call starts, or
the storage which the object occupies is released, or is reused by an object that is not nested within o ([intro.object]).
我正在尝试查找对象 o 的存储示例,该对象被 嵌套在 o 中的对象重用(相反标准所说的)。
首先,我需要确保我理解标准中“对象占用的存储 [...] 被嵌套在 o 中的对象重用”的含义。首先,为了重用存储,必须创建一个新对象。其次,要重用 o 的存储,必须在 o 使用的内存位置创建新对象。最后,必须在使新对象“嵌套在 o 内”的内存位置创建新对象,例如在“嵌套在 o 内”的已存在对象的位置。这是正确的吗?
我想到了一些例子,比如:
union 成员:
union U { double d; int n; }; U u = {1.0}; new (&u.n) int;
在字符数组中创建的对象:
char mem[sizeof(int)]; new (mem) int;
这些正确吗?还有其他例子吗?
谢谢。
最佳答案
我相信,标准中的“此处嵌套对象”只是指此处的成员子对象。从形式上讲,成员子对象占用其容器对象的存储空间,没有这种异常,类似于此代码
struct X {
Y y;
};
void foo(X& x) {
new (x.y) Y;
}
将结束 x
的存储。
另一个符合标准 (http://eel.is/c++draft/intro.object#4) 的嵌套对象示例是一个对象为另一个对象提供存储的情况。 unsigned char
(或 std::byte
)数组可以为另一个对象提供存储,如果它是在其中创建并放置新的。这几乎是您的第二个示例,除了在您的情况下 char 可以是有符号的或无符号的。
您的 union 示例是占用相同存储空间的非嵌套对象的正确示例。
关于C++ 标准 : end of lifetime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48713700/