gpt4 book ai didi

C++ 标准 : end of lifetime

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:42:04 27 4
gpt4 key购买 nike

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com