Unterschied pointer bei (eigenen) Klassen?
-
Hallo!
Ich bin zwar bei C++ lange kein blutiger Anfänger mehr habe aber ein Problem bei dem ich absolut nicht weiter weiß.Bei:
klasse* sv = new klasse;klappt alles (insbesondere die delete-abschnitte in der klasse). Wenn ich aber (was ich eigentlich will bloß mit ner variable)
klasse* sv = new klasse[1];nutze kommt
*** glibc detected *** ./hunted: free(): invalid pointer: 0x000000000137ba78 ***
Eigentlich dürfte es doch keinen unterschied machen?
-
Den Speicher hast du per new[] angefordert, also musst du ihn mit delete[] freigeben. Ob das jetzt 1 oder 100 Elemente sind..
-
mache ich ja. Nur bei delete für die klasse kommt am Ende eben was unterschiedliches (crash oder eben nicht) und zwar abhängig davon welche variante ich nehme. Dabei dürfte doch dabei kein Unterschied bestehen, oder doch ?
-
Nein, es macht einen Unterschied und wenn du es nicht mit dem richtigen Operator zerstörst, hast du undefiniertes Verhalten und crashen ist da sehr üblich.
-
Danke erstmal für alle Antworten!
Ich habe jetzt verstanden was ich tun muss, damit das Programm nicht mehr abstürzt. Ich weiß nur nicht genau warum ich das tun muss. Ich weiß natürlich dass man es so machen muss:
int* i = new int[100]; delete [] i; //und int* i = new int; delete i;Ich dachte aber das [] steht quasi für mehrere im Block Freizugebene. In meinem Programm fordere ich zwar im Block mehrere Klassen an (bsp oben). Speichere aber jede einzelne Adresse nochmal in nem pointer und delete dann die. Aber wie es jetzt aussieht nützt es nichts wenn ich jeden einzelnen Pointer auf jede einzelne Klasse delete. Ich muss trotzdem bei jeder einzelnen [] verwenden wenn ich das bei der Bereitstellung benutzt hab. Ich kann die einzelnen Elemente nicht ohne [] wieder freigeben.
Was ist denn der speichertechnische Unterschied zwischen [] und nicht [] den ich letztlich nicht bedacht hab?
-
Trigger_Hurt schrieb:
Was ist denn der speichertechnische Unterschied zwischen [] und nicht [] den ich letztlich nicht bedacht hab?
Bei der
delete[] ptr-Version sagst Du dem Compiler, dass es sich um einen Pointer auf ein Array handelt, und dass beim löschen geguckt werden soll, wieviele Objekte wieder gelöscht werden sollen.
Bei derdelete ptr-Version sagst Du dem Compiler, dass der Pointer auf ein einzelnen Objekt zeigt das gelöscht werden soll.Noch was:
int* pi_single = new int; int* pi_array = new int[10];Sowohl
pi_singleals auchpi_arraysind von Typ her int*. Woher soll der Compiler nun bei einemdeletewissen, ob die Pointer auf ein Array oder ein einzelnen Objekt zeigen? Am Pointer kann er das ja nicht sehen (ist in beiden Fällenint*. Diese Information gibst Du ihm über die [] beimdelete.
-
okay!

Woher soll der Compiler nun bei einem delete wissen, ob die Pointer auf ein Array oder ein einzelnen Objekt zeigen?
Klar weiß er das nicht, aber warum geht es (manuell) nicht auch so ?
int *test = new int[100]; for(int i = 0;i<100;i++) delete &(test[i]);Er muss ja nicht wissen dass es sich um ein array handelt wenn man es so macht... Klappt aber trotzdem nicht...

-
Ich sehe keinen Grund, warum der Compiler das nicht wissen sollte(es sich irgendwie merkt) und intern nicht auch verwenden könnte? Zur Laufzeit ist es natürlich nicht bekannt.
-
das geht so manuell _garnicht_. absolut nicht, weil der speicher für ein array
anders aufgebaut ist. bei einem einzelnen datum weiß der compiler durch en typ
wieviel er löschen muss. bei einem array gibt es 2 möglichkeiten. entweder der
compiler allokiert mehr und kopiert vor den anfang die daten. oder er merkt sich
global wie groß das array ist. man darf nicht davon ausgehen dass immer ein
verfahren genutzt wird. du musst ihm also genau den zeiger übergeben, den du
von new bekommen hast. alles andere, sogar ein +1 lässt das system abstürzen.
-
Vielen Dank! Jetzt hab selbst ich es verstanden
