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)