2014-04-25 40 views
1

我需要创建一个长度未知的布尔数组传递参数。所以,我有以下代码:在C++中动态布尔数组的默认值

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]; 

      }  
    } 
} 

对不起,我的英文不好!

在此先感谢!

+0

@ShafikYaghmour其实,我有两个问题...这回答后一个问题,但不为什么!boolArray [I]在Visual Studio返回false,但它在Eclipse返回true ... – cynthux

+0

它是未定义行为来使用一个未初始化的变量,所以它没有真正的说,但我不认为这方面使它不是一个重复。 –

+0

@ShafikYaghmour谢谢! – cynthux

回答

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]回报false在Visual Studio中,但它在Eclipse返回true?!?”

这只是的Visual C++选择效率,不进行初始化它不就得了,而在Eclipse(大概G ++)中使用的编译器初始化,即使它不具有并且不要求去做。

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

  • C++中的主要思想是:你不支付你不使用和Visual C++的行为在这里符合那个想法。

  • 零初始化可能很容易让用户产生他们的代码工作的错误印象,而实际上它不是可移植的。

+0

非常感谢!我现在明白了!谢谢!!! – cynthux