new frage
-
Bei Basistypen wie int, char, float etc. treten keine memory leaks auf wenn man zuvor mit new ein Array eines dieser Datentypen erzeugt und dieses nachher mittels delete löscht. Wenn man aber ein Array von (komplizierten) Klassenobjekten (w.z.B. std::string) am Heap erzeugt, und diesen nicht mit delete[] löscht, dann verursacht man mit Gewissheit memory leaks.
Trotzdem ist es natürlich sehr zu empfehlen einzelne Objekte mit delete und Arrays mit delete[] zu löschen.
-
Spawn schrieb:
Du musst es nicht machen, es ist aber sauberer und du bekommst den Speicher wieder freigegeben.
In einem System, das beispielsweise über mehrere Jahre ununterbrochen laufen können muß, wirst Du nicht drum herum kommen den Speicher freizugeben, den Du nicht mehr benötigst. Sonst wirst Du irgendwann schlicht keinen Speicher mehr haben und mußt abbrechen. Das wäre z.B. für eine Sicherheitssteuerung in einem Kernkraftwerk eine sehr unschöne Sache.
-
Aziz schrieb:
Bei Basistypen wie int, char, float etc. treten keine memory leaks auf wenn man zuvor mit new ein Array eines dieser Datentypen erzeugt und dieses nachher mittels delete löscht. Wenn man aber ein Array von (komplizierten) Klassenobjekten (w.z.B. std::string) am Heap erzeugt, und diesen nicht mit delete[] löscht, dann verursacht man mit Gewissheit memory leaks.
Hör doch bitte auf solche sinnlosen Informationen zu verbreiten. Der Aufruf von delete (statt delete[]) auf einem Array hat undefiniertes Verhalten. Egal ob das nun ein Array von ints oder Foos ist. Punkt. Jeder weitere Diskussion ist sinnlos, da undefiniertes Verhlatn nun mal undefiniert ist. Memory-Leaks sind hier dein kleinstes Problem. Und das Problem ist auch nicht unbedingt theoretischer Natur. Schließlich kann man die Funktionen new/new[] und delete/delete[] auch global überladen.
Du musst es nicht machen, es ist aber sauberer und du bekommst den Speicher wieder freigegeben
Wer der Meinung ist, er müsse hier kein delete aufrufen, der soll Visual Basic programmieren statt C++ oder noch besser einfach anfangen Abziehbildchen zu sammeln.
-
HumeSikkins schrieb:
Hör doch bitte auf solche sinnlosen Informationen zu verbreiten. Der Aufruf von delete (statt delete[]) auf einem Array hat undefiniertes Verhalten. Egal ob das nun ein Array von ints oder Foos ist. Punkt. Jeder weitere Diskussion ist sinnlos, da undefiniertes Verhlatn nun mal undefiniert ist. Memory-Leaks sind hier dein kleinstes Problem. Und das Problem ist auch nicht unbedingt theoretischer Natur. Schließlich kann man die Funktionen new/new[] und delete/delete[] auch global überladen.
Den Unsinn hab ich von Paul DiLascia. Er schreibt Artikel für das MSDN Magazin.
Ich werd mal versuchen den Artikel ausfindig zu machen, in dem er dieses Thema behandelt hat...Du hast außerdem Recht, dass man die Funktionen überladen kann. Ich hätte mich vielleicht etwas genauer ausdrücken sollen in meinem Beitrag von vorhin.
-
Es ist einfach so: delete[] ruft noch die Destruktoren der einzelnen Elemente auf und delete tut das nicht. Da int keinen Destruktor hat ist bei einem int-Array auch delete OK. Allerdings ist es besser, man gewöhnt sich bei Arrays immer an mit delete[] freizugeben, dann vergisst man es nicht so schnell.
-
Da int keinen Destruktor hat ist bei einem int-Array auch delete OK.
Nein.
-
Also hier ist der Link: http://www.microsoft.com/msj/archive/S202C.aspx
(Die Frage ganz unten)Ein Zitat von Bjarne Stroustrup: "The effect of deleting an array with the plain delete syntax is undefined, as is deleting an individual object with the delete [] syntax."
Somit hast du natürlich prinzipiell Recht. Entschuldige daher, dass ich unnütze Informationen verbreitet habe, denn wen interessiert es schon bei welchem Compiler es keine Probleme gibt wenn man ein Array nur mit delete löscht.
-
Der Aufruf delete für ein Array- Objekt hat keineswegs ein undefiniertes Verhalten.
Es wird nur das erste Array- Element gelöscht, nach verlassen des Sichtbarkeitsbereich ist den Pointer auf das Array nicht mehr vorhanden und der Speicher liegt unerreichbar herum.
-
LoL
-
Hume Sikkins schrieb:
Nein.
Doch!
Paul DiLascia im Microsoft System Journal, Septempber 1996:
With most library implementations, you won't get into trouble allocating simple C arrays like char[256] and then deleting them without []. In fact, I see this quite frequently in real code.
p = new char[256] . . . delete p; // should be delete [] p
Since no destructors are involved, this is safe. However, the [] brackets are crucial for arrays of objects with destructors, and real programming pros always insert them, even for char arrays, out of good habit and just to show off how smart they are.
-
With most library implementations
-
Spawn schrieb:
Der Aufruf delete für ein Array- Objekt hat keineswegs ein undefiniertes Verhalten.
Es wird nur das erste Array- Element gelöscht, nach verlassen des Sichtbarkeitsbereich ist den Pointer auf das Array nicht mehr vorhanden und der Speicher liegt unerreichbar herum.Wo im Standard soll das stehen?
-
Keine Ahnung, wo das steht, aber das Programm zeigt das Verhalten
#include<iostream> #include<stdlib.h> using namespace std; class X{ public: X(){cout << "Konstruktor" << endl;} ~X(){cout << "Destruktor" << endl;} }; int main(){ X* x = new X[10]; delete x; system("Pause"); }
-
übler Scherz von dir.
-
Spawn schrieb:
Keine Ahnung, wo das steht, aber das Programm zeigt das Verhalten
char* p=0; *p='x';
das funktioniert bei mir. Ist das jetzt legales C++?
-
Also wenn Struppi was sagt, dann stimmt das! Da kann dann auch kein MSDN-sonstewas-Experte was dran ändern.
Ich meine: Wer wird es besser wissen: der Vater von C++ oder ein Microsoftmitarbeiter?
-
Spawn schrieb:
Keine Ahnung, wo das steht, aber das Programm zeigt das Verhalten
Anscheinend hat es sich bei Neulingen eingebürgert, "undefiniert" zu sagen wenn "stürzt ab" gemeint ist. Nunja, das ist falsch. Dein Programm -- oder irgendein anderes Beispielprogramm -- interessiert nicht, wenn es um die Frage geht, ob das Verhalten definiert ist oder nicht. Definiert ist es, wenn im Standard vorgeschrieben ist, was dann zu passieren hat. Undefiniert ist es, wenn der Standard keinerlei Anforderungen an das Verhalten stellt.
(In Abschnitt 5.3.5 kann man sich über delete und delete[] schlau machen.)
http://anubis.dkuug.dk/jtc1/sc22/open/n2356/
-
Hallo,
also erstmal möchte ich darauf hinweisen, dass ich niemals unregistriert poste. Also nicht verwechseln.Als nächste kann ich nur sagen, dass mir eure Ignoranz manchmal die Sprache raubt. Entweder man weiß etwas, dann kann man auch das Maul aufreißen oder man weiß es nicht, dann hält man sich besser an den bekannten Rat von Dieter Nuhr. Alternativ kann man natürlich auch gerne Nachfragen. Nur sollte man sich nicht an unhaltbare Behauptungen klammern.
Zum Thema:
Im Standard steht unter 5.3.5/2:In the first alternativ (delete object), the value of the operand of delete shall be a pointer to a non-array object or a pointer to a sub-object representing a base class of such an object[...]. If not, the behavior is undefined.
Es spielt keine Rolle was Paul DiLascia in irgendeinem Journal schreibt und noch weniger spielt es eine Rolle, was irgendein Spawn auf irgendeinem Compiler für ein Ergebnis gesehen haben möchte.
Statt hier sinnlos zu disktuieren, sollte man sich schlicht und einfach eine Sache merken: Zu new passt delete und zu new[] passt delete[]. Fertig.
Alle die mehr wissen wollen, kommen nicht drum rum sich zuvor mit ein paar hässlichen Details zu beschäftigen. Dazu gehören auch solche Dinge wie die Bedeutung von "undefiniertem Verhalten".