如果生命周期结束,是否允许隐式或显式地重用对象存储?

Bar*_*rry 11 c++ lifetime language-lawyer c++17

请考虑以下示例:

// create some storage
alignas(int) char buffer[2 * sizeof(int)];

// new object of type int at the storage of buffer, the int pointed
// to by p begins its lifetime here, buffer's lifetime is over
int* p = new (buffer) int{42};

// some entirely unrelated int
int j = 17;
Run Code Online (Sandbox Code Playgroud)

是否允许最后的其他存储,指向buffer的新int对象尚未使用的部分p重新打开到堆栈并由后续自动存储持续时间对象隐式重用?换句话说,是否允许一致的实施&j == p+1


相关地,明确地重用其他存储是明确定义的行为吗?

alignas(int) char buffer[2 * sizeof(int)];
int* p = new (buffer) int{42};
int* q = new (p+1) int{6}; 
Run Code Online (Sandbox Code Playgroud)

也就是说,两者都int指向p并且q仍在其生命周期内吗?

Bay*_*ayK -2

是的,完全没问题。

alignas(int) char buffer[2 * sizeof(int)];
Run Code Online (Sandbox Code Playgroud)

在堆栈上分配 8 个字节。

 int* p = new (buffer) int{42};
 int* q = new (p+1) int{6};
Run Code Online (Sandbox Code Playgroud)

这些新运算符不分配内存来构造对象,而是使用缓冲区。

但请注意,这些对象的生命周期将是缓冲区变量的生命周期。当缓冲区被销毁时,p 和 q 引用的内存也将被销毁。

同样在一般情况下,您应该在缓冲区被销毁之前手动调用析构函数。

因此,问题的答案是“如果生命周期结束,是否允许对象存储隐式或显式重用?” 没有。当缓冲区的生命周期结束时,继续使用它的内存是不安全的,因为稍后它将用于其他堆栈变量。

PS我相信你确实明白,在你的情况下,像这样管理内存会更容易;

int buffer[2];
int* p = &buffer[0];
int* q = &buffer[1];
Run Code Online (Sandbox Code Playgroud)

图像