How can I make `new[]` default-initialize the array of primitive types?
Every now and then I need to call new[]
for built-in types (usually char
). The result is an array with开发者_如何学C uninitialized values and I have to use memset()
or std::fill()
to initialize the elements.
How do I make new[]
default-initialize the elements?
int* p = new int[10]()
should do.
However, as Michael points out, using std::vector
would be better.
Why don't you just use std::vector? It will do that for you, automatically.
std::vector<int> x(100); // 100 ints with value 0 std::vector<int> y(100,5); // 100 ints with value 5
It is also important to note that using vectors is better, since the data will be reliably destructed. If you have a new[]
statement, and then an exception is subsequently thrown, the allocated data will be leaked. If you use an std::vector, then the vector's destructor will be invoked, causing the data to be properly deallocated.
This relatively old topic can now be enhanced by another variant.
I was using bool, because there is a quite strange specialization for vector<bool>
#include <memory>
...
unique_ptr<bool[]> p{ new bool[count] {false} };
this can now be accessed with the operator[]
p[0] = true;
just like std::vector<T>
this is exception safe.
(I suppose this wasn't possible back at 2010 :) )
Primitive type default initialization example:
int* p = new int[5]; // gv gv gv gv gv (gv - garbage value)
int* p = new int[5](); // 0 0 0 0 0
int* p = new int[5]{}; // 0 0 0 0 0 (Modern C++)
int* p = new int[5]{ 1,2,3 }; // 1 2 3 0 0 (Modern C++)
精彩评论