C 中的隐式对象创建:“构造”的棘手案例
C 中,使用内存复制 (memcpy) 时的行为使用普通可复制类型可能会引发有关对象生命周期的问题。下面的代码片段说明了其中的歧义:
#include <cstdlib> #include <cstring> struct T { int x, y; }; int main() { void *buf = std::malloc(sizeof(T)); if (!buf) return 0; T a{}; std::memcpy(buf, &a, sizeof a); T *b = static_cast<T *>(buf); b->x = b->y; free(buf); return 0; }
关键问题是以 T *b = static_cast 开头的代码段是否创建了一个生命周期已开始的对象。 C 标准对此问题缺乏明确性,称其为未指定。
N3751,一篇建议将 memcpy 识别为对象构造操作的论文,尚未被标准接受。当前的标准草案提到了通过定义、new 表达式或实现需求来创建对象,但没有明确解决使用 memcpy 制作的副本。
提案 p0593 旨在通过引入隐式对象创建的概念来解决这种歧义用于低级内存操作。它建议 memcpy 和类似的操作在新分配的存储中隐式创建对象。这将为所呈现的代码片段提供明确定义的行为。
但是,需要注意的是,p0593 尚未经过审查或接受。因此,memcpy 与普通可复制类型一起使用时的行为在 C 标准中仍未指定。
以上是memcpy 是否在 C 中隐式构造对象?的详细内容。更多信息请关注PHP中文网其他相关文章!