我知道如果一个C++结构是纯旧数据(“memcpy”),那么它的内存结构就不会有魔力,所以它意味着一个字节数组的memcpy和memcpy返回是安全的。
我也知道在标准中POD结构不应该有用户定义的构造函数。在我现在拥有的项目中,有一些普通的结构(只有数据字段),它定义了一个默认构造函数,将数据成员初始化为0。我看到其他客户机在使用结构之前都会使用memset(&obj, 0, sizeof obj);。
在我使用非memset结构之前,它可以安全吗?
发布于 2014-04-17 03:13:54
拥有构造函数并不会使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,代码可能会中断。
从下面的注释中可以看出,编辑的定义似乎已经从C++03更改为C++11。
毕竟,使用memset(&obj, 0, sizeof obj);可能不安全。
发布于 2014-04-17 02:46:17
海事组织,这取决于用例。我见过memset用来在几个大型机应用程序上设置空白字符的数据,例如
memset(&obj, ' ', sizeof(obj));如果struct定义一个const变量并初始化该值,memset将覆盖该值。因此,使用memset初始化豆荚是安全的,而且大多数情况都是安全的。那是我的2美分。
https://stackoverflow.com/questions/23123606
复制相似问题