Destruktor direkt aufrufen

sheel

I love Asm
Hi

hätte eine Frage zu Destruktoren in einer Klasse; zeig am besten ein Beispiel:

Code:
class k
{
public:
k(){/*Konstruktor...*/}
~k(){/*Desstruktor*/}

/*weiteren inhalt*/
};

//...

k *klasse=new klasse;

klasse->~k(); //!

Ist ein direkter aufruf des destruktors ohne delete etc.wie oben grundsätzlich nicht möglich? Sollte eigentlich schon sein, da es im Grunde ja eigentlich nur wie eine
"normale" Funktion gehandhabt wird?

Falls das normalerweise möglich ist, ist es aber wahrscheinlich, dass mir das MFC dazwischenfunkt :rolleyes: das micht sich meiner meinung nach ein bisschen zuviel in das Programm ein :)

Der Grund für diese Annahme ist, dass das Programm beim destruktor abstürzt, aber immer im Modul mfc42.dll

Also, wär echt froh wenn jemand mich aufklären kann...hab wohl anno dazumal beim Klassen-lernen nicht genug aufgepasst ^^

gruß sheel
 
Möglich ist das schon nur macht es keinen Sinn und ist auch schlechter Stil.
Der Destruktor wird automatisch aufgerufen, wenn das Objekt zerstört wird.
Ein händischer Aufruf des Destruktors zerstört das Objekt nicht sondern nur ggf. die Daten, die vom Construktor dynamisch alloziiert wurden.
Beim korrekten Zerstören des Objektes wird der Destruktor dann erneut aufgerufen.


Gruß
 
das weiss ich ja wohl alles, ich bräucht nur einen weg, den destruktor selber aufrufen und dann nicht beim Programmende oder mit delete die klasse entfernen, sondern mit free (dass ja nur den speicher freigibt ohne etwas aufzurufen).

alternative: im grund hab ich eine klasse a und davon ein zb 100 elemente großes pointerarray. und jeder pointer kriegt nach bedarf extra wasmit new zugewiesen. geht auch.

dann will ich einzelne mit delete wieder löschen, dabei löscht er mir aber nicht nur den einen pointerinhalt, sonern das ganze array.dann hab ich mor gedacht ich start den destruktor selber und dann mit free freigeben...nur beim destruktoraufruf stürzt es immer ab; und es liegt nicht am funktionsinhalt...
wenn man class k von obern hernimmt:
zB

k *arr[100];
arr[27]=new k;

delete arr[27]; //löscht blöderweise mehr als die eine klasse?!

ich bräucht einfach eine antwort, ob das mit dest/free gehen sollte oder nicht; wenn ja ist das mfc-zeug schuld

gruß sheel
 
k *arr[100];
arr[27]=new k;

delete arr[27]; //löscht blöderweise mehr als die eine klasse?!

Wie befüllst Du das Array mit Objekten vom Typ k, in einer Schleife oder einzeln?
Wie wird dann später delete aufgerufen?

Mir scheint Dein Code nämlich korrekt, das einzige wo ich mir vorstellen kann das es knallt, ist das Array - es ist nach der Erzeugung nicht 0 initialisiert. Wenn jetzt ein delete für einen Pointer aufgerufen wird, in dem zwar nicht NULL aber auch kein tatsächliches Objekt drin hat, dann knallt es beim Destruktoraufruf zu diesem "toten" Pointer.
Sowas kann man schon beim deklarieren vermeiden, indem (auch für die Zukunft) immer sofort wo es geht auch initialisiert wird. Es ist immer besser - egal wie sicher man sich ist, das die Daten später schon noch initialisiert werden - sie zu initialisieren.

Dein Array könnte man z.B. so definieren: k *arr[100] = { 0 };

Damit wären alle Pointer NULL initialisiert und selbst wenn jetzt mal "aus versehen" ein delete für so einen Pointer aufgerufen wird, passiert nichts weil delete mit einem NULL Pointer umgehen kann.

Also ich tippe ganz stark das Du delete auf nicht initialisierte Pointer aufrufst, daher der Absturz beim Destruktor.

PS: Speicher der mit new alloziiert wurde muss auch mit delete freizugeben sein, geht das nicht stimmt was nicht am Code! Daran ist weder delete Schuld (also alternativ free benutzen ist Unsinn) noch der Compiler ;).

Gruß René
 
Der Ponter ist sicher in Ordnung.
Erstens wird alles initialisiert, und ausserdem:
Bei so einem pointer wie du vermutest, wäre in einem 40-Tausend-Byte-code schon früher ein fehler aufgetreten :)
nein das ist schon in ordnung.

ist nur seltsam: mit free gehts :)
wenn ich die aufräumarbeiten vom destruktor in eine "normale" funktion schreib,
die aufruf und dann mit free das erledige, dann klappt alles wunderbar.

Hat das perfekte delete ja vielleicht doch einen bug? :)

sheel
 
Hmm
einen Bug kann man nie ausschliessen nur mal im ernst: sehr unwahrscheinlich!
Das wäre schon vor vielen Jahren aufgefallen ;)


Die Meinung das Dein Code in Ordnung ist, teile ich ehrlich gesagt nicht.
Manchmal steckt der Teufel in Detail - wenn ich recht überlege - eigentlich immer :D.
Zeig mal den relevanten Code dann sehen wir weiter.

Gruß
 
Ich soll dir also im Ernst 8000 Zeilen Code schicken ;)
Ich glaub, das wird nichts bringen!?
Ich tu nämlich schon fast ein halbes jahr immer wieder auf der blöden stelle herum...
ich mach es einfach mit free, da stürzt es wenigstens nicht mehr ab
 

Neue Beiträge

Zurück