2010-03-18 9 views
19

Hin und wieder muss ich new[] für eingebaute Typen anrufen (normalerweise char). Das Ergebnis ist ein Array mit nicht initialisierten Werten und ich muss memset() oder std::fill() verwenden, um die Elemente zu initialisieren.Wie kann ich `new []` default-initialisieren das Array von primitiven Typen?

Wie mache ich new[] default-initialisieren die Elemente?

+7

Ich bin nicht sicher, ob diese gültig ist, sondern arbeitet auf VC9 in Ordnung. 'int * p = new int [10]();' – Naveen

Antwort

25

int* p = new int[10]() sollte tun.

Wie jedoch Michael points out, wäre die Verwendung std::vector besser.

+2

Sie können auch die einheitliche Initialisierungssyntax von C++ 11 verwenden: 'new int [10] {}'. –

+2

@Fernando: Sie können jetzt, danke für das Aufzeigen. Es wäre jedoch schwierig gewesen, einen Compiler zu finden, der das im Mai 2010 akzeptiert hat. ':)' – sbi

22

Warum verwenden Sie nicht einfach std :: vector? Es wird das für Sie automatisch tun.

 
std::vector<int> x(100); // 100 ints with value 0 
std::vector<int> y(100,5); // 100 ints with value 5 

Es ist auch wichtig zu beachten, dass die Verwendung von Vektoren besser ist, da die Daten zuverlässig zerstört werden. Wenn Sie eine new[]-Anweisung haben und anschließend eine Ausnahme ausgelöst wird, werden die zugeordneten Daten durchgelassen. Wenn Sie einen std :: vector verwenden, wird der Destruktor des Vektors aufgerufen, wodurch die Daten ordnungsgemäß freigegeben werden.

+2

stimme ich völlig zu, dass Vektor ist oft besser, aber ich will immer noch neu []. +1 sowieso. – sharptooth

1

Dieses relativ alte Thema kann jetzt durch eine andere Variante erweitert werden. Ich war mit Bool, weil es eine ziemlich seltsame Spezialisierung ist für vector<bool>

#include <memory> 
... 
unique_ptr<bool[]> p{ new bool[count] {false} }; 

kann dies jetzt mit dem operator[]

p[0] = true; 

wie std::vector<T> dies Ausnahme sicher zugegriffen werden.

(ich nehme an, dies nicht möglich war, auf das Jahr 2010 zurück :))

Verwandte Themen