首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用用户定义的默认构造函数来设置普通结构安全吗?

用用户定义的默认构造函数来设置普通结构安全吗?
EN

Stack Overflow用户
提问于 2014-04-17 02:36:07
回答 2查看 1.5K关注 0票数 5

我知道如果一个C++结构是纯旧数据(“memcpy”),那么它的内存结构就不会有魔力,所以它意味着一个字节数组的memcpymemcpy返回是安全的。

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

在我使用非memset结构之前,它可以安全吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-17 03:13:54

拥有构造函数并不会使struct成为非POD。

如果聚合类没有用户定义的复制赋值操作符和析构函数,并且它的非静态成员中没有一个是非POD类、非POD数组或引用,则称为POD。

因此,打电话是非常安全的。

代码语言:javascript
复制
memset(&obj, 0, sizeof obj);

在具有构造函数的struct对象上,只要它是POD。

它是否可以,取决于。如果struct的默认构造函数希望将成员初始化为1以保持正常行为,那么上述对memset的调用可能会影响依赖于1为默认值的代码的行为。

以下面的struct为例

代码语言:javascript
复制
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);可能不安全。

票数 3
EN

Stack Overflow用户

发布于 2014-04-17 02:46:17

海事组织,这取决于用例。我见过memset用来在几个大型机应用程序上设置空白字符的数据,例如

代码语言:javascript
复制
memset(&obj, ' ', sizeof(obj));

如果struct定义一个const变量并初始化该值,memset将覆盖该值。因此,使用memset初始化豆荚是安全的,而且大多数情况都是安全的。那是我的2美分。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23123606

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档