我知道如果C ++结构是普通旧数据(“POD”),那么这就保证了它的内存结构没有魔力,所以它意味着memcpy
到一个字节数组memcpy
}回来是安全的。
我也知道在标准中,POD结构不应该有用户定义的构造函数。在我现在拥有的项目中,有一些普通的结构(只有数据字段),定义了一个默认构造函数,将数据成员初始化为0.我看到其他客户端在使用结构之前会使用memset(&obj, 0, sizeof obj);
。
在使用之前memset
非POD结构是否正常或安全?
答案 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美分。