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

CBenni::O

1x Contest-Sieger

  • »CBenni::O« ist der Autor dieses Themas

Beiträge: 1 145

Wohnort: Stuttgart

  • Private Nachricht senden

21

23.02.2010, 21:46

ich dachte, weil innerhalb der map speichert der ja dann einen T**, einen Zeiger auf meinen Zeiger.
Denn normalerweise gibt er ja den Speicherplatz frei, wenn du ihm nur einen T übergibst; intern wird er einen T* haben, den er dann mit delete freigibt. Aber da er dann den Speicherplatz von meinem T* freigibt, ist das Objekt T immernoch auf dem Heap und blockiert diesen.

Zur verdeutlichung:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
//Normal:

class foo;

std::map<int,foo> MyMap;
//...

MyMap.clear() // Gibt alle foo's frei


std::map<int,foo*> MyMap2;
//...

MyMap2.clear(); // gibt alle foo* e frei! da diese aber (z.B.) duch new foo() erstellt wurden, gibt es hier ein Memoryleak!


Ist es deutlich genug? Im prinzip müsste ich nicht einen foo*, sondern z.B. std::tr1::shared_ptr speichern, oder gibt es eine andere Möglichkeit?

mfg CBenni::O
Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.
42!
Aufräumen kann jeder, nur das Genie überblickt das Chaos!
Metal will never die!
1. Sppro Gamecontest - mein Beitrag

idontknow

unregistriert

22

23.02.2010, 21:50

edit: mein fail

-> durch iterieren und manuell löschen?

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

23

23.02.2010, 21:51

Dann hast du das mit den Iteratoren falsch gemacht. Probiers nochmal und schau, dass du dann einen Zeiger auf foo zerstörst und nichts anderes. Und auch nicht vergessen das Element dann gleich zu entfernen (oder besser zuerst entfernen und dann den Speicher frei geben).

24

23.02.2010, 22:04

Oder besser erst gar nie besitzende Zeiger in STL-Containern speichern. C++ zwingt einen schliesslich nicht, Speicher manuell zu verwalten. Besonders Container sollen einem (unter anderem) genau diese Arbeit abnehmen...

CBenni::O

1x Contest-Sieger

  • »CBenni::O« ist der Autor dieses Themas

Beiträge: 1 145

Wohnort: Stuttgart

  • Private Nachricht senden

25

23.02.2010, 22:08

Das Problem ist, dass die Klasse, die ich speichere, nicht kopiert werden kann. Von daher muss ich leider irgendwie einen Zeiger in der map verwenden...

mfg CBenni:O
Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.
42!
Aufräumen kann jeder, nur das Genie überblickt das Chaos!
Metal will never die!
1. Sppro Gamecontest - mein Beitrag

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

26

23.02.2010, 22:08

Stimmt. Und wenn man dennoch in Verlegenheit kommt Speicher so zu verwalten, dann ist es besser, wenn man einen Poniter Containter nimmt:
http://www.boost.org/doc/libs/1_42_0/libs/ptr_container/doc/ptr_container.html

als in einer ordinären map, list o.ä. Smart Pointer zu speichern.

27

23.02.2010, 22:25

Zitat von »"Nexus"«

Zitat von »"_Tom_"«

Viel mehr als auf der Seite bei dem ersten aufscheinenden Link kann mit sf::Thread scheinbar auch nicht machen.
Was genau meinst du? Du kannst von sf::Thread erben und da deine eigene Funktionalität einrichten. Oder eben den Callback benutzen.


Ich hatte mich darauf bezogen: http://www.sfml-dev.org/tutorials/1.2/system-threads.php

Gemeint habe ich das vor allem im Zusammenhang mit der Memberfunktion als Threadfunktion. Das ist in boost::thread mit boost::bind schon drinnen...

Zitat von »"Nexus"«

Zumal die WinAPI auch eine Bibliothek ist.

Und wenn du schon SFML verwendest, warum dann auf ein Betriebssystem festlegen?

Zitat von »"drakon"«

Stimmt. Und wenn man dennoch in Verlegenheit kommt Speicher so zu verwalten, dann ist es besser, wenn man einen Poniter Containter nimmt:
http://www.boost.org/doc/libs/1_42_0/libs/ptr_container
/doc/ptr_container.html

Womit wir wieder bei Boost wären :)
Tutorials zu OpenGL, Ubuntu und Programmieren allgemein: www.tomprogs.at

Forum und Wiki zum Programmieren lernen: proggen.org/forum.proggen.org

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

28

23.02.2010, 22:42

Wir war nochmal das Sprichwort? Alle Wege führen nach Boost? :D

CBenni::O

1x Contest-Sieger

  • »CBenni::O« ist der Autor dieses Themas

Beiträge: 1 145

Wohnort: Stuttgart

  • Private Nachricht senden

29

24.02.2010, 21:44

Noch mal zum Iterativen löschne von Maps:

Was ist daran falsch?

C-/C++-Quelltext

1
2
3
4
5
6
std::map<std::string,BBB::Resource*>::iterator MyIt;
for(MyIt = MyResources.begin(); 
     MyIt < MyResources.end(); 
     MyIt++)
{
}


Fehler: 58 (Sind alle ungefähr gleich und kryptisch):

Zitat

d:\benny\cpp\visualcpp\resmgr2\resmgr2\resmgr.cpp(17) : error C2784: "bool std::operator <(const std::queue<_Ty,_Container> &,const std::queue<_Ty,_Container> &)": template-Argument für "const std::queue<_Ty,_Container> &" konnte nicht von "std::_Tree<_Traits>::iterator" hergeleitet werden.
with
[
_Traits=std::_Tmap_traits<std::string,BBB::Resource *,std::less<std::string>,std::allocator<std::pair<const std::string,BBB::Resource *>>,false>
]
c:\programme\microsoft visual studio 9.0\vc\include\queue(107): Siehe Deklaration von 'std::operator <'


Hat jemand eine Ahnung, was das heißen soll?

Die MSDN hat mir überhaupt nicht weitergeholfen, ebenso wenig Google...

Danke ;)
mfg CBenni::O
Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.
42!
Aufräumen kann jeder, nur das Genie überblickt das Chaos!
Metal will never die!
1. Sppro Gamecontest - mein Beitrag

30

24.02.2010, 21:48

Du musst auf != abfragen nicht <.
Oder willst du das letzte Element wirklich nicht haben?

Werbeanzeige