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

21

30.04.2004, 14:41

Zitat

Zu malloc und new:
Man kann afaik auch den speicher an sich mit malloc reservieren und dann mit placement new sein objekt darin platzieren. Wie man die objekte dann wieder zerstört weis ich nicht mehr genau, aber ich denke, dass man einfach nur den destructor aufrufen muss.
Hmm....das ist aber sehr umständlich. Und auch nicht ratsam beide verfahren zu mixen.
Das kann zu dicken Problemen führen.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Jumping Jack

Treue Seele

Beiträge: 142

Wohnort: Hamburg

Beruf: Schüler

  • Private Nachricht senden

22

30.04.2004, 15:33

Zu welchen Problemen denn?

23

30.04.2004, 15:57

1) Wenn man ein Objekt mit new erstellt und dann mit free freigibt, wird nicht der Destruktor von dem Objekt aufgerufen. Bei evntl. dynamisch reservierten Speicher im Objekt, wird dieser nicht freigegeben. Memory Leak.

2) Speicher für ein Objektes wird mit malloc reserviert. Es wird kein Konstruktor aufgerufen. Das Objekt ist zwar vorhanden aber evntl. nicht lauffähig. Abstürze können die folge sein.

3) Ein Array wird mit malloc erstellt. Wo legt es die Info ab, wieviele Objekte erzeugt wurden? Bei malloc eigentlich gar nicht wichtig. Für Objekte aber sehr wohl, da die Konstruktoren für alle Objekte aufgerufen werden müssen.

Wenn es um die Arbeit mit Objekten geht ist generell die Anwendung von new und delete ein muss. Ein mix von malloc/free und new/delete kann da tötlich sein und zu einem nicht Definierten verhalten des Programms führen.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Jumping Jack

Treue Seele

Beiträge: 142

Wohnort: Hamburg

Beruf: Schüler

  • Private Nachricht senden

24

30.04.2004, 16:40

ja, das stimmt schon.
Allerdings ist placement new != new .
placement new reserviert keinen speicher, sondern setzt nur ein objekt in bestehenden speicher, den man sonstwie alloziiert hat.
Bei placement new wird der constructor aufgerufen, sowie der destructor beim zerstören des objekts. der speicher kann dann wieder über free freigegeben werden (wurde ja mit malloc alloziiert).

25

30.04.2004, 17:25

Wie ich schon sagte. Das ist recht kompliziert um Speicher zu Reservieren, oder nich :rolleyes:

Mein bei einfachen Variablen wie char oder int spielt es keine Rolle was man nun nutzt. Aber bei Objekten sollte man es bei new/delete belassen.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Jumping Jack

Treue Seele

Beiträge: 142

Wohnort: Hamburg

Beruf: Schüler

  • Private Nachricht senden

26

30.04.2004, 17:53

Klar ist es umständlich :P

Aber man kann placement new gut fürs memory management verwenden.
Man reserviert einen großen block speicher(Pool) und platziert dann seine objekte mittels placement new darin.

In der STL kann man das verwenden. Ganz interessant dazu:

What are Allocators good for?

27

30.04.2004, 19:44

So einen Speichermanager hab ich schon mal Implementiert. Reserviert wurde ein großer Speicherbereich und darin wurde alles abgewickelt. Die letzte Version dieses Manager habe ich in meine GTL verband.
Es ändert sich allerdings nichts. Man nutzt weiterhin nur new/delete und keinen mix im normalen gebrauch. Nur die Memory Manager Class benutzt malloc/free für reservierung und freigabe des Speicherblocks.

Das schöne an der STL. Man muss da nicht alle Alocatoren neu schreiben, sondern wenn man den new/delete Operator überläd, wird er direkt von der STL benutzt. Darum sollte man auch keine STL Komponenten beim Memory Manager nutzen.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Werbeanzeige