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

Maverick

Frischling

Beiträge: 14

Wohnort: Paderborn

Beruf: IT Fachinformatiker ANW

  • Private Nachricht senden

11

18.04.2003, 20:04

Hm also ich habe deine Version grade mal getestet, du machst ja auch nix anders, wenn ich jetzt eine klasse habe, die wiederum selbst wieder Pointer auf andere Klassen enthält, machst du nix anderes als die Speicheraddressen zu Kopieren, aber nicht deren Inhalt.

Quellcode

1
2
for(unsigned int c = 0; c < m_uiSize; ++c)
            m_pArray[c] = pData[c];


Um eine tiefe Kopie zu erzeugen musst du die in der klasse selbst enthaltende Objekte auch kopieren, du referenzirst nur, und wenn du den ursprünglichen Container löscht zeigen die Referenzen ins leere. Kannst du ja gerne mal ausprobieren. Für deine Methode müssen die Klassen eine Copy Methode enthalten, die Jedes Objekt Kopiert, und das ist sau langsam, weil du rekursiv in die tiefe gehen musst, bis du die letzte klasse erreicht hast. Teste es mal, erstell eine CArray, das Komplexe Klassen enthält, die wiederum Pointer auf viele andere besitzen. Kopiere das Array, und lösche das erste. Die destruktoren der Klassen werden aufgerufen, und die Pointer werden gelöscht, jetzt sind alle Elemente in der Kopie der ersten CArray Valid, da die Pointer der Klassen ins leere zeigen. Zum testen habe ich einfache Smart_ptr’s die auf den stack erzeugt wurden benutzt. Klar funktioniert das ganze, wenn die Objekte irgendwo außerhalb erzeugt wurden, aber das kann ja nicht der sinn sein? Es gibt nur den weg über das reference counting um solche Probleme zu lösen.

Um das ganze mal zu veranschaulichen.

Smart_ptr (Enthält) RealPtr, RealPtr enthält Komplexes Objekt, Array wird Kopiert, dass erste Array wird gelöscht, Destrucktor der Smart_ptr’s löschen die Objekte, alle Kopierten Smart_ptr’s zeigen ins leere.

Oder willst du mir verbieten Objekte direkt in der AddMethode zu erzeugen? Dafür würde dich jeder C++ Coder totschlagen. Du kannst das Problem nur lösen, indem du ein Träger verwendest, der in dem Array eingebunden wird, der die Daten enthält und auch einen reference counting vornimmt, und erst dann sich löscht wenn der ref count bei 0 ist.

mfg

Maverick

12

18.04.2003, 21:06

Das ist ja auch alles richtig was du sagts.
Deine Argumente Zielen direkt auf die Performance und ob man eine tiefe oder eine flache Kopie macht, entscheidet der User selber und nicht ich.

Wenn kein Zuweisungsoperator Defniert ist, wird automatisch eine flache Kopie erzeugt. Das ist aber immer so, egal ob in meiner oder in irgendeiner anderen Klasse. Nur wenn man seinen eigenen Zuweisungsoperator Definiert kann auch eine Tiefe Kopie überhaupt zustannde kommen.

Quellcode

1
2
3
4
5
6
7
class MyClass
{
  int* m_pKA;

public:
  ~MyClass() { if(m_pKA) delete m_pKA; }
};

Hier wird eine flache Kopie erstellt. Immer!

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
class MyClass
{
  int* m_pKA;

public:
  MyClass(const MyClass& c) { m_pKA = new int(*c.m_pKA); }

  MyClass& operator = (const MyClass& c)
  {
     m_pKA = new int(*c.m_pKA);
     return *this;
  }
};

Hier ist es genau anders. Hier wird immer eine tiefe Kopie erstellt. Wie auch immer ich eine Kopie der Instanz erstelle.

Wie man sieht wird es dem User überlassen, ob er eine flache, tiefe oder einen SmartPointer verwenden will.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

13

08.05.2003, 21:02

Also ich habe jetzt einen schönes Speichermanagment System. Ich habe es in zwei Teile aufgeteilt. Einem Tracker und einem Pool.

Der Tracker Protokolliert die Speicherbewegungen und Prüft am Ende des Progs nach ob irgendwo ein Memory Leak entstanden ist und gibt dann den Speicher auch schön frei. Das funktioniert auch alles wunderbar. Nur die Ausgabe der Informationen happerts ein wenig. Ich wollte eine schöne MessageBox anzeigen lassen die alle Informationen auflistet. Die Box hab ich bereits erstellt. Nun will ich es anzeigen. Mit CreateDialog kann ich das leider nicht machen da ich den Programm Instanz Handle nicht hab und ohne kackt mir die Funktion einfach ab. Jetzt kam ich auf die Idee das ganze selber zu machen, da es mit CreateWindow wunderbar klappt, auch ohne den Instanz Handle :) Nur muss ich jetzt die Resource auslesen damit meine Box auch richtig erzeugt werden kann. Wie genau macht man das? Ein Stichwort oder eine Funktion würde schon reichen.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Werbeanzeige