Problem mit List, Iterator und Pointern auf Objekte
-
Ich habe jetzt wirklich viel herumprobiert und komme zu dem Ergebnis das die folgende Methode
Pointer von Objekten in einer Liste zu hinterlegen als einzige in meinem Projekt zu gerenderten Ergebnissen
führt. Ich muss wohl eher einen Fehler gemacht haben als ich die vielen verschachtelten Schleifen erstellt habe.
Wenn ich die Kollisionsschleifen in meiner Gameschleife auskommentiere bekomme ich auch keine Fehlermeldung.list<CObjekt> ObjektListe; list<CObjekt>::iterator ObjektIterator; while( TimerA >= TimerB) { CObjekt *pPointerX = new CObjekt( BspWertA, BspWertB ); pPointerX->Memberfunktion("BspDateiname.png"); ObjektListe.push_back(*pPointerX); TimerA = 0; } for(ObjektIterator = ObjektListe.begin(); ObjektIterator != ObjektListe.end(); ++ObjektIterator) { ObjektIterator->Update(); ObjektIterator->Render(); } ObjektListe.clear();
-
Warum "new"? Du hast da einen schönen Memory Leak produziert.
-
Wie teste ich mein Programm effektiv auf Memory Leaks ? Etwa mit VS 2019 Community ?
-
@_andi84 sagte in Problem mit List, Iterator und Pointern auf Objekte:
Pointer von Objekten in einer Liste zu hinterlegen
Du hinterlegst keine Pointer!
-
Habe folgende Anleitung gefunden:
Memory Leaks findenUnd Ja es gibt welche:
Screenshot
-
@_andi84 Für Linux gibt es Valgrind, was da recht mächtig ist. Für Windows gibt es auch tools, die nach Speicher Problemen suchen können, siehe vlt: https://stackoverflow.com/questions/413477/is-there-a-good-valgrind-substitute-for-windows
Regel Nummer 1 um Memory Leaks zu verhindern: Keine manuelle Speicherverwaltung (kein new)!
-
@_andi84 sagte in Problem mit List, Iterator und Pointern auf Objekte:
Wie teste ich mein Programm effektiv auf Memory Leaks ?
Das Memory Leak ist in der while Schleife. Da braucht man nichts zu suchen!
-
Wie kann ich denn auf die Objekte zugreifen wenn ich die ohne new direkt als ganzes Objekt in der Liste hinterlege ?
Weil Iterator->Methode() funktioniert irgendwie nicht.
-
@_andi84 sagte in Problem mit List, Iterator und Pointern auf Objekte:
funktioniert irgendwie nicht
ist keine Fehlerbeschreibung
-
@_andi84 sagte in Problem mit List, Iterator und Pointern auf Objekte:
while( TimerA >= TimerB) {
CObjekt *pPointerX = new CObjekt( BspWertA, BspWertB );
pPointerX->Memberfunktion("BspDateiname.png");
ObjektListe.push_back(*pPointerX);
TimerA = 0;
}Was spricht denn gegen:
while( TimerA >= TimerB) { auto object = CObjekt( BspWertA, BspWertB ); object.Memberfunktion("BspDateiname.png"); ObjektListe.emplace_back(object); TimerA = 0; }
Das hat nichts mit Iteratoren zu tun. Iteratoren sind, wie der Name sagt, zum iterieren durch Container und sind irgendwie eine Referenz auf die entsprechende Position im Container, d.h. du kannst über den Iterator auf deine Objekte zugreifen.
-
...und wenn dein CObjekt Probleme beim Kopieren macht, dann machst du statt deiner
std::list<CObject>
eben einestd::list<std::unique_ptr<CObject>>
. Dann kannst du sowas machen und brauchst keindelete
:auto pPointerX = std::make_unique<CObjekt>( BspWertA, BspWertB ); pPointerX->Memberfunktion("BspDateiname.png"); ObjektListe.push_back(std::move(pPointerX));
(und warum eigentlich
std::list
stattstd::vector
- sicher dass du eine Liste brauchst?)
-
@wob
wenn ich mir die Kopie sparen wollen würde, würde ich wohl sowas machen:while( TimerA >= TimerB) { ObjektListe.emplace_back(BspWertA, BspWertB ); ObjektListe.back().Memberfunktion("BspDateiname.png"); TimerA = 0; }
Aber ich glaube, dass, wenn CObjekt nicht Kopierbar ist bzw da Probleme macht, _andi84 noch ganz andere Probleme bekommt.
Und, weil ich es auch nicht verstehe: Warum list und nicht vector?
-
Ich habe es jetzt hinbekommen:
So erzeuge ich die Objekte (heißen inzwischen CParticle ):
if (Zeitgeber.GetTimerTicks() >= SpawnTime) { SDL_Point StartPos = { 400,300 }; srand(SDL_GetTicks()); float fAngle = (float)(rand() % 360); SDL_Log("%f", fAngle); CParticle* pParticle = new CParticle(StartPos, 0.5, fAngle); ParticlesList.push_back(pParticle); SpawnTime = Zeitgeber.GetTimerTicks() + 1; }
So werden diese aufgerufen:
for (myParticle = ParticlesList.begin(); myParticle != ParticlesList.end(); ++myParticle) { (*myParticle)->Update(); (*myParticle)->Render(); }
Und so lösche ich diese wieder:
for (myParticle = ParticlesList.begin(); myParticle != ParticlesList.end();) { delete(*myParticle); myParticle = ParticlesList.erase(myParticle); }
Hoffe es hilft vielleicht irgendwem weiter. Gruß _andi84
-
Warum
new
unddelete
? Das ist nicht nötig und sollte vermieden werden.
-
@_andi84 sagte in Problem mit List, Iterator und Pointern auf Objekte:
srand(SDL_GetTicks());
Nein! Einmal!
-
@_andi84 sagte in Problem mit List, Iterator und Pointern auf Objekte:
for (myParticle = ParticlesList.begin(); myParticle != ParticlesList.end(); ++myParticle) { (*myParticle)->Update(); (*myParticle)->Render(); }
Das kannst du einfacher schreiben:
for (auto *particle : ParticlesList) { particle->Update(); particle->Render(); }
ParticlesList
hört sich wie eine Klasse an. Ich würde Variablen immer mit Kleinbuchstaben beginnen. Und ist das "List" im Namen notwendig? Schlage Umbenennung inparticles
vor.
-
@_andi84 sagte in Problem mit List, Iterator und Pointern auf Objekte:
float fAngle = (float)(rand() % 360);
Was tut der Cast hier deiner Meinung nach?
-
Ausnahme ausgelöst bei 0x54E7CA8E (SDL2.dll) in SDL2_Klassen_Projekt.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0xDDDDDDDD.
@manni66
Habe ich mal geändert.
ParticlesList ist vom Typ std::list<CParticle*>
myParticle ist vom Typ std::list<CParticle*>::iterator myParticleDer Cast wandelt hier eine Zahl zwischen 0 und 360 in einen float Wert den ich später in einer
Funktion benötige.MfG _andi84
-
Diese ganzen Fragen a la
Und, weil ich es auch nicht verstehe: Warum list und nicht vector?
oder
Was tut der Cast hier deiner Meinung nach?
wurden dir wahrscheinlich nicht gestellt, weil die Fragenden wirklich eine Erklärung von dir möchten. Denk vielleicht mal darüber nach, was sie wohl eigentlich damit sagen wollten…
-
@_andi84 sagte in Problem mit List, Iterator und Pointern auf Objekte:
ParticlesList
Angenommen du hast als Datenstruktur
std::listy<CParticle> ParticlesList
dann bekommst du hier:
CParticle pParticle(StartPos, 0.5, fAngle); ParticlesList.push_back(pParticle);
einen Fehler?
Wenn du das machst darfst du natürlichdelete(*myParticle);
nicht mehr schreiben. Und(*myParticle)->Update();
wird zu(*myParticle).Update();
und analoge Änderungen.