Ich werde nicht -1, aber wenn Sie es möglicherweise sogar vergessen können, deleteist Ihr Code falsch.
GManNickG
2
8 Jahre später könnte dieser Kommentar Anfänger @GManNickG verwirren. Wie wäre es, ihn zu löschen (da er vermutlich erstellt wurde, bevor Jason Iverson das Array tatsächlich gelöscht hat)?
Gsamaras
2
@gsamaras: Ich stimme zu, es ist verwirrend, aber es ist immer noch richtig: Ihr Code sollte keine manuelle Löschung haben, an die Sie denken müssen, um nicht zu vergessen. Das heißt, verwendete intelligente Zeiger und andere Container.
GManNickG
@GManNickG Ich denke, Ihr Kommentar könnte weniger dogmatisch sein. Der Code ist korrekt, auch wenn er nicht ideal ist. Intelligente Zeiger und Container sind fast immer eine bessere Option (insbesondere bei einer Anfängerfrage wie dieser), aber nicht immer "immer".
Spencer
62
Seit C ++ 11 gibt es eine sichere Alternative zu new[]und ohne delete[]Overhead std::vector:
std::unique_ptr<int[]>array(newint[size]);
In C ++ 14:
autoarray= std::make_unique<int[]>(size);
Beide oben genannten basieren auf derselben Header-Datei. #include <memory>
Ich weiß nicht, ob es nur ich ist, aber diese C ++ 11-Syntax sieht schrecklich aus. Das C ++ 14 sieht viel besser aus. Andererseits habe ich seit vor C ++ 11 nicht mehr Schritt gehalten. Es ist schwer, sich an all diese neuen Ausdrücke zu erinnern.
Keya Kersting
28
Möglicherweise möchten Sie die Standardvorlagenbibliothek verwenden. Es ist einfach und benutzerfreundlich und Sie müssen sich keine Gedanken über die Speicherzuweisung machen.
int size =5;// declare the size of the vectorvector<int> myvector(size,0);// create a vector to hold "size" int's// all initialized to zero
myvector[0]=1234;// assign values like a c++ array
Ok, aber die eigentliche Frage zu beantworten ist auch schön.
Ed S.
8
@Ed, die Einschränkung in der Frage scheint eher willkürlich. std::vectormit dem entsprechenden Konstruktor funktioniert wirklich gut und sollte als Alternative hervorgehoben werden. Manchmal stellen die Leute die Frage schlecht, und dies kann als einer dieser Fälle gelten - es ist sehr kurz und gibt keinen Grund, es zu bevorzugen new.
Mark Ransom
3
@Ed: Es gibt keinen Grund, new[]stattdessen zu verwenden std::vector.
GManNickG
2
@baash: In C ++ gibt es nie einen Grund. Wenn Sie aus irgendeinem Grund entscheiden, "die Standardbibliothek zu entfernen", programmieren Sie nicht mehr in C ++. Mein Kommentar bezieht sich auf die C ++ - Sprache, nicht auf die C ++ - Sprache, die wir auf meinem Gerät verwenden. Trotzdem sollten Sie deleteniemals etwas manuell benötigen . Ist auch std::vectorein dynamisches Array und macht nichts mit einer verknüpften Liste. Es ist nur eine Hülle um einen Teil der Erinnerung.
GManNickG
1
@Montdidier: Nein. Sie verwenden newund deleteimplementieren immer noch Wrapper. Der Punkt ist, dass Sie eine Ressource nicht verwalten und verwenden, sondern das eine oder andere tun.
@GManNickG Weil Vektor bequemer sein kann oder aus anderen Gründen? Weil ich häufig auf Funktionen von Drittanbietern stoße, die die Verwendung von Arrays anstelle von Vektoren erfordern.
Lèse Majesté
5
@ Lèsemajesté Das ist kein Grund, keine Vektoren zu verwenden - Die std::vector::data()Member-Funktion gibt das zugrunde liegende Raw-Array zurück, wenn dies erforderlich ist.
Emlai
3
@zenith: Normalerweise würden Sie operator&eher verwenden, als data()einen Zeiger von einem Vektor abzurufen , aber es stimmt, dass ein Vektor die Kontiguitätsgarantie bietet, die für die Kompatibilität mit Funktionen erforderlich ist, die Arrays erwarten.
Ben Voigt
3
Sobald es um dynamisches Array geht, möchten Sie möglicherweise nicht nur ein Array mit variabler Größe erstellen, sondern auch dessen Größe zur Laufzeit ändern. Hier ist ein Beispiel mit memcpy, das Sie verwenden können memcpy_soder std::copyauch. Abhängig vom Compiler <memory.h>oder <string.h>möglicherweise erforderlich. Wenn Sie diese Funktionen verwenden, weisen Sie einen neuen Speicherbereich zu, kopieren die Werte der ursprünglichen Speicherbereiche und geben sie dann frei.
// create desired array dynamicallysize_t length;
length =100;//for exampleint*array=newint[length];// now let's change is's size - e.g. add 50 new elementssize_t added =50;int*added_array =newint[added];/*
somehow set values to given arrays
*/// add elements to arrayint* temp =newint[length + added];
memcpy(temp,array, length *sizeof(int));
memcpy(temp + length, added_array, added *sizeof(int));delete[]array;array= temp;
Sie können stattdessen Konstante 4 verwenden sizeof(int).
Wahrscheinlich fehlt Ihnen der Doppelpunkt oder Sie haben SIZE nicht durch eine tatsächliche Größe ersetzt.
Montdidier
5
Warum sollte es ein Semikolon geben? Es ist keine vollständige Aussage. Es könnte mehr Erklärungen geben. Wenn dies in einem vollständigen Programm enthalten ist, entspricht dies den Anforderungen des OP.
Der obige Code funktioniert, die maximale Float- oder Int-Array-Größe, die definiert werden konnte, war mit der Größe 2095879, und die Exit-Bedingung wäre nicht Null, beginnend mit der Eingangsnummer
std::vector<int>
. Und ein Buch .Antworten:
Vergessen Sie nicht
delete
jedes Array, das Sie zuweisennew
.quelle
delete
ist Ihr Code falsch.Seit C ++ 11 gibt es eine sichere Alternative zu
new[]
und ohnedelete[]
Overheadstd::vector
:In C ++ 14:
Beide oben genannten basieren auf derselben Header-Datei.
#include <memory>
quelle
Möglicherweise möchten Sie die Standardvorlagenbibliothek verwenden. Es ist einfach und benutzerfreundlich und Sie müssen sich keine Gedanken über die Speicherzuweisung machen.
http://www.cplusplus.com/reference/stl/vector/vector/
quelle
std::vector
mit dem entsprechenden Konstruktor funktioniert wirklich gut und sollte als Alternative hervorgehoben werden. Manchmal stellen die Leute die Frage schlecht, und dies kann als einer dieser Fälle gelten - es ist sehr kurz und gibt keinen Grund, es zu bevorzugennew
.new[]
stattdessen zu verwendenstd::vector
.delete
niemals etwas manuell benötigen . Ist auchstd::vector
ein dynamisches Array und macht nichts mit einer verknüpften Liste. Es ist nur eine Hülle um einen Teil der Erinnerung.new
unddelete
implementieren immer noch Wrapper. Der Punkt ist, dass Sie eine Ressource nicht verwalten und verwenden, sondern das eine oder andere tun.quelle
std::vector::data()
Member-Funktion gibt das zugrunde liegende Raw-Array zurück, wenn dies erforderlich ist.operator&
eher verwenden, alsdata()
einen Zeiger von einem Vektor abzurufen , aber es stimmt, dass ein Vektor die Kontiguitätsgarantie bietet, die für die Kompatibilität mit Funktionen erforderlich ist, die Arrays erwarten.Sobald es um dynamisches Array geht, möchten Sie möglicherweise nicht nur ein Array mit variabler Größe erstellen, sondern auch dessen Größe zur Laufzeit ändern. Hier ist ein Beispiel mit
memcpy
, das Sie verwenden könnenmemcpy_s
oderstd::copy
auch. Abhängig vom Compiler<memory.h>
oder<string.h>
möglicherweise erforderlich. Wenn Sie diese Funktionen verwenden, weisen Sie einen neuen Speicherbereich zu, kopieren die Werte der ursprünglichen Speicherbereiche und geben sie dann frei.Sie können stattdessen Konstante 4 verwenden
sizeof(int)
.quelle
Ordnen Sie dynamisch Speicher zu, indem Sie
new
:quelle
Der obige Code funktioniert, die maximale Float- oder Int-Array-Größe, die definiert werden konnte, war mit der Größe 2095879, und die Exit-Bedingung wäre nicht Null, beginnend mit der Eingangsnummer
quelle