В стандартном C ++ вы можете по умолчанию инициализировать практически все, включая этот массив:
bool* boolArray = new bool[size](); // Zero-initialized
Полная программа, которая также проверяет результат и освобождает массив:
bool foo( int size )
{
bool* boolArray = new bool[size](); // Zero-initialized
// Check that it is indeed zero-initialized:
for( int i = 0; i < size; ++i )
{
if( boolArray[i] ) { delete[] boolArray; return false; }
}
delete[] boolArray; return true;
}
#include <iostream>
int main()
{
using namespace std;
cout << (foo( 42 )? "OK" : "Ungood compiler") << endl;
}
Примет ли ваш компилятор правильную вещь или даже сделает это совсем другое дело.
Итак, на практике если вы испытываете непреодолимое желание использовать необработанный массив, тогда, возможно, лучше использовать std::fill
или что-то подобное, или даже необработанный цикл.
Но обратите внимание на повторяющиеся delete[]
-выражения.Такой избыточный код очень легко ошибиться: это Evil ™.И еще много чего может пойти не так с использованием необработанных массивов, так что для новичка просто скажите No ™ необработанным массивам, указателям и т. Д.
Вместо этого используйте стандартные библиотечные контейнеры, которые управляют распределением, инициализациейКопирование и освобождение для вас - правильно.Однако есть небольшая проблема, а именно преждевременная оптимизация в std::vector<bool>
, которая в противном случае была бы естественным выбором.По сути, std::vector<bool>
использует только один бит на значение, поэтому он не может раздавать ссылки на элементы bool
, а вместо этого раздает прокси-объекты ...
Так, для элементов bool
используйте, например, astd::bitset
(когда размер известен во время компиляции) или, например, std::deque
, как указано ниже:
#include <deque>
bool foo( int size )
{
std::deque<bool> boolArray( size ); // Zero-initialized
for( int i = 0; i < size; ++i )
{
if( boolArray[i] ) { return false; }
}
return true;
}
#include <iostream>
int main()
{
using namespace std;
cout << (foo( 42 )? "OK" : "Ungood compiler") << endl;
}
Cheers & hth.,