首页 >后端开发 >C++ >在 C 中使用 memcpy 创建的对象何时开始其生命周期?

在 C 中使用 memcpy 创建的对象何时开始其生命周期?

DDD
DDD原创
2024-11-08 18:55:02226浏览

When Does an Object Created with memcpy in C   Begin Its Lifetime?

在 C 中使用 memcpy 创建不确定的对象

在 C 中,当分配一个对象时,它的字节缓冲区会从其源复制。但是,此复制的确切机制尚未指定,从而引发了有关对象生命周期的问题。

考虑以下代码片段:

#include <cstdlib>
#include <cstring>

struct T   // trivially copyable type
{
    int x, y;
};

int main()
{
    void *buf = std::malloc( sizeof(T) );
    if ( !buf ) return 0;

    T a{};
    std::memcpy(buf, &amp;a, sizeof a);
    T *b = static_cast<T *>(buf);

    b->x = b->y;

    free(buf);
}

在此代码中,使用 malloc 分配缓冲区。然后使用 memcpy 将一个简单的可复制对象 a 复制到该缓冲区中。 b 中存储了对复制对象的引用。

问题是:b 所指向的对象的生命周期从什么时候开始?也就是说,什么时候使用memcpy复制它,或者什么时候b指向它?

标准不明确

C标准目前在这个问题上保持沉默。一篇题为“对象生命周期、低级编程和 memcpy”的论文提出,将 memcpy 用于普通可复制类型视为对象构造,但尚未讨论或纳入标准。

草案标准解读

C 14 草案标准建议对象在定义时创建,使用 new 表达式创建,或者在必要时由实现创建。然而,复制普通可复制类型的标准中涵盖的情况似乎仅涉及已经存在的对象。

隐式对象创建提案

提案 p0593 尝试解决通过定义隐式对象创建操作(包括 malloc 和 memcpy)来解决这个问题。该提案尚未经过审核。

结论

目前,C 标准并未指定使用 memcpy 创建的对象何时开始其生命周期。因此,所提供的代码片段的行为是未定义的。提案 p0593 为这种歧义提供了潜在的解决方案,但尚未被标准接受。

以上是在 C 中使用 memcpy 创建的对象何时开始其生命周期?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn