【问题标题】:C++ Zero-out a struct array?C ++将结构数组清零?
【发布时间】:2013-03-14 10:54:31
【问题描述】:
struct OBJECT
{
unsigned int Var1;
std::string Str1;
...
bool YesNo;
};

OBJECT Obj[ 327 ];

我对如何将 Obj 归零感到困惑。它有几种不同类型的元素。我是否必须将其所有成员设置为 0? 喜欢...Obj[0].Str = ""; ?那么问题来了,正确的做法是什么?

我的尝试:

::memset( &Obj, 0, sizeof( Obj ) );

我不确定我是否做得正确......

哦,有没有更快的方法将数组归零?

【问题讨论】:

  • sizeof( TYPE ) * 327 不是对象本身
  • 提供正确的默认构造函数。
  • @DenisErmolin 感谢您的关注。
  • 我很确定您的许多对象都没有简单的复制/默认构造函数。 memset 不是办法。
  • @Jon 不! std::string 如果你把它设为 0 就会恐慌!

标签: c++


【解决方案1】:

不要这样做,因为你的结构中有重要的成员(例如std::string)。如果您的所有成员都只是简单的数据类型,例如intchardouble 或指针,您可以这样做。

这种结构的正确方法是定义一个构造函数,它可以正确初始化所有成员

struct OBJECT {
    OBJECT() : Var1(0), YesNo(false), ... {}

    unsigned int Var1;
    std::string Str1;
    ...
    bool YesNo;
};

【讨论】:

  • 这个想法有一个缺点:在添加新成员时,很容易忘记更新构造函数,而 memset/std∷fill 方式则不会需要更新。
  • @Hi-Angel 是的,只要您只有微不足道的成员,您就是对的。但是,对于更复杂的成员,memset 甚至可能很危险,因为它会压倒成员的记忆。有关未初始化成员变量的讨论,请参阅 stackoverflow.com/q/2099692/1741542
  • @OlafDietsche 谢谢你的建议;我试过了,我不得不说似乎没有一个很好的方法来明确地找到统一变量。 -Weffc++ 选项给出数百个错误警告,valgrind 仅在运行时有用,而我正在使用运行时在嵌入式设备中的应用程序。也许 cppcheck 对此有用 - 不确定,我没有尝试过这个特定问题。
  • @Hi-Angel 我自己没有尝试过这些,所以不能真正发表评论。快速检查显示,-Weffc++ 和 cppcheck 似乎都不是很可靠。 -Weffc++ 即使有一个非 POD 类型的默认构造函数也会抱怨,而当没有定义构造函数时它根本不会抱怨。 cppcheck 根本不显示任何警告。也许新版本会更好。
【解决方案2】:

“正确”的方法是为你的结构添加一个构造函数方法,初始化任何没有自己的构造函数的成员变量,例如:

OBJECT_STRUCT()
: Var1(0)
, YesNo(false)
{
}

在该示例中,您会注意到 Str1 未初始化;这是因为std::string 有自己的构造函数来初始化它。

【讨论】:

    【解决方案3】:

    要么提供自定义默认构造函数,要么使用编译器定义的默认构造函数:

    std::fill(std::begin(Obj), std::end(Obj), OBJECT());
    

    请注意,fill 方法填充仅在您使用默认构造函数时才有效。

    【讨论】:

      【解决方案4】:

      您应该将您的声明更改为

      struct OBJECT
      {
          unsigned int Var1;
          std::string Str1;
          ...
          bool YesNo;
      
         OBJECT()
         : Var1()
         , Str1()
         , ...
         , YesNo(false)
         {
             // Do Nothing
         }
      };
      

      您应该在 std::arraystd::vector 上使用的数组 - 将初始化对象。

      【讨论】:

        猜你喜欢
        • 2015-09-16
        • 1970-01-01
        • 1970-01-01
        • 2011-01-01
        • 2015-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多