C ++中动态bool数组的默认值

时间:2014-04-25 14:00:56

标签: c++ arrays dynamic boolean

我需要创建一个参数传递未知长度的bool数组。所以,我有以下代码:

void foo (int size) {

    bool *boolArray = new bool[size];

    for (int i = 0; i < size; i++) {

            if (!boolArray[i]) {

                cout << boolArray[i];

            }
    }
}

我以为布尔数组正在用假值初始化......

然后,如果我在Eclipse中运行该代码(在Ubuntu上),它对我来说运行正常,该函数会打印所有值,因为!boolArray [i] 返回true(但值不是错误值,它们是垃圾值)。如果我在Visual Studio中运行它,值也是垃圾值,但该函数不会打印任何值(因为!boolArray [i] 返回false)。为什么默认情况下数组值不是假值?!?为什么!boolArray [i] 在Visual Studio中返回false,但它在Eclipse中返回true?!?

我读到了这个问题:Set default value of dynamic array,所以如果我改变代码如下,它对我来说也很好(在Eclipse和Visual Studio中)!但我不明白为什么。

void foo (int size) {

    bool *boolArray = new bool[size]();

    for (int i = 0; i < size; i++) {

            if (!boolArray[i]) {

                cout << boolArray[i];

            }      
    }
}

抱歉我的英语不好!

提前致谢!

1 个答案:

答案 0 :(得分:1)

为POD实例添加(),在C ++ 03及更高版本中调用值初始化。在C ++ 98中,它调用了默认初始化。但是对于POD类型,两者都减少到零初始化,对于布尔值,零都是假的。

例如,如果S是POD struct,并且您有变量

S o;

然后你可以通过

将其归零
o = S();

不需要不安全和丑陋的memset


顺便说一下,std::vector<bool>是原始数组bool的更高级替代,但由于现在被视为过早优化,它有一点奇怪的行为:它支持每个实现由一个位表示的布尔值,因此取消引用迭代器不会像对bool所期望的那样提供对std::vector的引用。所以更好的替代方案是std::vector<My_bool_enum>My_bool_enum已正确定义。或者只是std::vector<char>。 ; - )


关于

  

“为什么!boolArray[i]在Visual Studio中返回false但在Eclipse中返回true?”?“

只是Visual C ++选择效率,而不是初始化它不需要的地方,而Eclipse中使用的编译器(可能是g ++)会初始化,即使它不需要也不需要执行。< / p>

我更喜欢这里的Visual C ++行为有两个原因:

  • C ++中的一个主要想法是你不为你不使用的东西付费,而且这里的Visual C ++行为符合这个想法。

  • 零初始化很容易让用户误认为他们的代码有效,而实际上它不可移植。