c++ - 使用用户定义的默认构造函数 memset 普通结构是否安全?

标签 c++

我知道,如果 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/

相关文章:

c++ - 在 C++ 中结合正则表达式

c++ - C int 到 char 转换添加了垃圾字符

c++ - Qt C++ 连接QPushButton 点击

c++ - 模板化配置值类和全局列表

c++ - 错误: reference to overloaded function could not be resolved

c++ - 将模板化智能指针类型作为模板参数传递

c++ - 从函数返回 "variable string literal"

c++ - OpenCV拼接

c++ - 取消对可输入 Win32 Edit 控件的字符数的限制

c++ - 由于已经定义而导致的链接器错误