用用户定义的默认构造函数memset普通结构是否安全

Is it safe to memset the plain struct with user-defined default constructor?

本文关键字:结构 是否 安全 memset 构造函数 用户 定义 默认      更新时间:2023-10-16

我知道,如果C++结构是纯旧数据("POD"),那么这就保证了它的内存结构中没有魔法,所以这意味着字节数组的memcpy和返回的memcpy是安全的。

我还知道,在标准中,POD结构不应该有用户定义的构造函数。在我现在拥有的项目中,有一些简单的结构(只有数据字段),定义了一个默认的构造函数,将数据成员初始化为0。我看到其他客户端在使用该结构之前会使用memset(&obj, 0, sizeof obj);

在我使用非POD结构之前,memset可以还是安全?

拥有构造函数不会使struct成为非POD。

如果聚合类没有用户定义的复制赋值运算符和析构函数,并且它的非静态成员都不是非POD类、非POD数组或引用,则该聚合类称为POD。

鉴于此,调用是完全安全的

memset(&obj, 0, sizeof obj);

在具有构造函数的CCD_ 6的对象上,只要它是POD。

它是否可以,取决于。如果struct的默认构造函数希望将成员初始化为1以实现正常行为,则对memset的上述调用可能会影响依赖于1作为默认值的代码的行为。

以以下struct:为例

struct Direction
{
   Direction() : x(1.0), y(0.0), z(0.0) {}
   double x;
   double y;
   double z;
};

类型为Direction的对象期望至少一个组件是非零的。当所有零部件都为零时,无法定义方向。如果使用memset将所有内容设置为0,则代码可能会中断。

编辑从下面的评论来看,POD的定义似乎从C++03变成了C++11。

使用CCD_ 15可能并不安全。

IMO这取决于用例。我见过在一些大型机应用程序(如)上使用内存集设置带有空白字符的数据

memset(&obj, ' ', sizeof(obj));

如果结构定义了一个常量变量并初始化该值,则memset将覆盖该值。因此,使用memset对PODS进行初始化取决于情况,而且在大多数情况下是安全的。那是我的2美分。