Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

CodingCat

1x Contest-Sieger

Beiträge: 420

Beruf: Student (KIT)

  • Private Nachricht senden

11

21.10.2008, 20:50

Auch wenn du aus dem überladenen Operator heraus das originale delete aufrufst, wird kein D~tor aufgerufen, da der Compiler aus void* den richtigen D~tor nicht mehr finden wird.

[EDIT] Hier geht's aber ab. Da stand grad eben noch mehr. ;-)
alphanew.net (last updated 2011-06-26) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite

12

21.10.2008, 20:54

Zitat von »"CodingCat"«

[EDIT] Hier geht's aber ab. Da stand grad eben noch mehr. ;-)
Ich hab eben gerade die Falschheit meiner Aussage erkannt. ;)

Tut mir leid deswegen, ich hatte vergessen, dass bei explizitem Operatoraufruf kein Destruktor aufgerufen wird (halt wie bei operator new). Dabei hatte ich auch eine Zeit lang mit diesem Dilemma zu kämpfen...

Eigentlich blöd, dass new und delete so C-mässig implementiert sind, man hat überhaupt keine Typinformationen, sondern nur void*. :?

BlackSnake

Community-Fossil

  • »BlackSnake« ist der Autor dieses Themas

Beiträge: 1 549

Beruf: Student

  • Private Nachricht senden

13

21.10.2008, 22:51

ich zeichne ja nicht nur eigene typen auf, sondern auch neu reservierte, wie zum beispiel int, char....

das mit dem nicht aufruf des destruktors musste ich auch schon feststellen. bis jetzt rufe ich wirklich jedes mal den destruktor manuel auf, was auf die dauer irgendwie nervt, aber ne andere lösung gibt es anscheinend ja nicht ;).

EDIT:
würde es helfen, wenn ich den delete operator überschreibe? also das ich dann nur sowas schreiben brauch:

C-/C++-Quelltext

1
2
int* a = new int;
delete(a);

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

14

21.10.2008, 23:20

Zitat von »"BlackSnake"«

würde es helfen, wenn ich den delete operator überschreibe?


du kannst den delete operator nicht überschreiben.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

15

22.10.2008, 11:24

Zitat von »"BlackSnake"«

ich zeichne ja nicht nur eigene typen auf, sondern auch neu reservierte, wie zum beispiel int, char....

das mit dem nicht aufruf des destruktors musste ich auch schon feststellen. bis jetzt rufe ich wirklich jedes mal den destruktor manuel auf, was auf die dauer irgendwie nervt, aber ne andere lösung gibt es anscheinend ja nicht ;).


Schreib dir doch eine entsprechende Funktion:

C-/C++-Quelltext

1
2
3
4
5
6
template< typename T >
void Free( T* ptr )
{
    ptr->~T();
    free( ptr ); // oder sonstige ...

}
@D13_Dreinig

BlackSnake

Community-Fossil

  • »BlackSnake« ist der Autor dieses Themas

Beiträge: 1 549

Beruf: Student

  • Private Nachricht senden

16

22.10.2008, 12:41

David_pb
vielen dank. hat mir sehr geholfen.
ich wusste gar nicht, dass man bei templates den typenidentifizierer (hier jetzt T) als destrukter nutzen kann ;)

17

22.10.2008, 14:21

Zitat von »"BlackSnake"«

ich wusste gar nicht, dass man bei templates den typenidentifizierer (hier jetzt T) als destrukter nutzen kann ;)
Das ist eben der Vorteil gegenüber C (sprich void*), da dies eine typsichere Möglichkeit darstellt, weil T schon zur Compilezeit eingesetzt wird.

Statt free() wie in David_pbs Beispiel könntest du jetzt ja deinen operator delete aufrufen.

Werbeanzeige