dynamischer speicher mit new
-
new T und new T[1] gleich????????????
Ich glaub das wuerde sich gleich verhalten, ist aber unsauber ...
wenn du die anzahl (new T[1] ) weisst, warum dass dann dynamisch erzeugen ?
wenn die anzahl ne variable ist (new T[a] ) ist, und 1 nen sonderfall, dann musst es eh als array betrachten ...Ciao ...
-
danke erst mal für hilfe!!
int size=1;
p=new int[size];dann kann ich nicht: delete p ??? muss ich delete [] p; oder?
und wenn
p=new int;dann muss ich so machen: delete p;
cu
-
new fordert delete und new[] fordert delete[]. Eigentlich ganz einfach.
-
der_held schrieb:
new fordert delete und new[] fordert delete[]. Eigentlich ganz einfach.
typedef int int_array[10]; int *a = new int_array; ... delete[] a; // !!!
-
also bedeuted das, dass delete[] den speicherplatz eines arrays und delete den speicherplatz eines andren objekts freigibt?
-
also bedeuted das, dass delete[] den speicherplatz eines arrays und delete den speicherplatz eines andren objekts freigibt?
Noe ....
man sieht oft:
char * myBuff = new char[10]; // hier ganz wilder code delete mybuff;
der code funktioniert immer noch ....
mit pods ists kein unterschied, ob delete oder delete[] aufgerufen wird.
ist aber unsauber.problematisch wirds hier
class Test { public: Test(){mp = new int}; ~Test(){delete mp}; private: int * mp; } // und irgendwo im code Test * mytestarray = new Test[10]; // delete mytestarray; // Speicherleak, und zwar genau int * 9 = 36 byte; Mit debug etwas mehr :p delete[] mytestarray; // hier alles ok.
Das Array selbst wird mit delete auch freigegeben ... aber der Destruktor der elemente wird nicht aufgerufen ...
Ciao ...
-
RHBaum schrieb:
char * myBuff = new char[10]; // hier ganz wilder code delete mybuff;
der code funktioniert immer noch ....
mit pods ists kein unterschied, ob delete oder delete[] aufgerufen wird.
ist aber unsauber.Nö, undefiniertes Verhalten.
-
Nö, undefiniertes Verhalten.
ups, ok der Standard sagt delete[] !!!
der VC6++ kanns, dem ists schnuppe.
Glaub der gcc kanns auch.
welcher compiler kanns nich ? (nur damit ich gewarnt bin. mir begegnet das ned ganz so unhaeufig)bei deinem code
typedef int int_array[10]; int *a = new int_array; ... delete[] a; // !!!
laesst sich der VC++ nich verarschen ....
warning C4156: Loeschen eines Feldausdrucks ohne Verwendung der Feldform von 'delete'; Feldform automatisch verwendetDie Klassenvariante kann er nich und meckert auch nich .... erst zut laufzeit uebergibt er sich
Ciao ...
-
RHBaum schrieb:
welcher compiler kanns nich ? (nur damit ich gewarnt bin. mir begegnet das ned ganz so unhaeufig)
Keine Ahnung, aber ich kann mir ohne weiteres eine Implementierung vorstellen, die da die Hufe hochreißt.
-
Hallo,
spätestens wenn ich die gloabalen Operator-Funktionen new und delete, nicht aber new[] und delete[] überlade (oder beide unterschiedlich), wirst du keine Freude mehr haben. Wie auch immer: Es muss ja nicht immer erst etwas passieren.
new - delete
new[] - delete[]
Fertig ist der Lack. In der Zeit in der man sich über mögliche Äquivalenzen den Kopf zerbrochen hat, habe ich die beiden Klammer schon 84ig Mal getippt.
-
In der Zeit in der man sich über mögliche Äquivalenzen den Kopf zerbrochen hat, habe ich die beiden Klammer schon 84ig Mal getippt.
Darumgehts ja nich ...
Ich selber pass ja auch auf. Nutze aber viel code / libs, wo andere fuer zustaendig sind. Und da tauchts halt auf ...Die compiler selber sind daran ned ganz unschuldig ....
die sache mit dem typedef erkennt er, und meckerts an. (warning)
Bei pods sagt der compiler gar nix, als waers halt so normal ...Ciao ...