我知道,如果 C++ 结构是普通旧数据(“POD”),那么这保证了它的内存结构中没有魔法,所以它意味着 memcpy
到字节数组和 memcpy
返回是安全的。
我也知道在标准的 POD 结构中不应该有用户定义的构造函数。在我现在拥有的项目中,有一些普通结构(只有数据字段)定义了一个默认构造函数,它将数据成员初始化为 0。我看到其他客户会使用 memset(&obj, 0, sizeof obj);
在使用结构之前。
在使用非 POD 结构之前 memset
是否可以或安全?
最佳答案
拥有构造函数不会使 struct
成为非 POD。
An aggregate class is called a POD if it has no user-defined copy-assignment operator and destructor and none of its nonstatic members is a non-POD class, array of non-POD, or a reference.
鉴于此,调用是完全安全的
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);
可能并不安全。
关于c++ - 使用用户定义的默认构造函数 memset 普通结构是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23123606/