使用用户定义的默认构造函数对纯结构进行memset是否安全?

时间:2014-04-17 02:36:08

标签: c++

我知道如果C ++结构是普通旧数据(“POD”),那么这就保证了它的内存结构没有魔力,所以它意味着memcpy到一个字节数组memcpy }回来是安全的。

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

在使用之前memset非POD结构是否正常或安全?

2 个答案:

答案 0 :(得分:3)

拥有构造函数不会产生struct非POD。

  

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

鉴于此,致电

是完全安全的
memset(&obj, 0, sizeof obj);

在具有构造函数的struct的对象上,只要它是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。

毕竟使用memset(&obj, 0, sizeof obj);可能不安全。

答案 1 :(得分:0)

IMO这取决于用例。我已经看到memset用于在少数主机应用程序中设置具有空格字符的数据,即

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

如果struct定义了一个const变量并初始化了该值,memset将覆盖这样的值。因此,使用memset初始化PODS取决于大多数情况是安全的。那是我2美分。