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

big_muff

Alter Hase

Beiträge: 460

Wohnort: Schweiz

Beruf: Informatikstudent (4. Semester)

  • Private Nachricht senden

11

10.03.2007, 12:24

C-/C++-Quelltext

1
2
3
4
   Element *pCurElement; 
    pCurElement = new Element; 

    pCurElement = m_pPtrToFirstElement;
Das gibt scho mal ein schönes Ressourcenleck.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
   while(pCurElement != NULL) 
    { 
        if((pCurElement->m_pNextElement) == NULL) 
        { 
            //[...]

        } // while(pCurElement != NULL) 


        pCurElement = pCurElement->m_pNextElement; 
    } 
Das ganze ist unnötig du speicherst ja das letzte Element

C-/C++-Quelltext

1
2
3
4
    pCurElement = new Element; 

    if((pCurElement = m_pPtrToFirstElement) == NULL) 
    { return 0; } 
Noch ein Ressourcenleck

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
unsigned long ChainedList::ShowList(void) 
{ 
    //[...]


    while(pCurElement != NULL) 
    { 
        //[...]

    } // while(pCurElement != NULL) 


    PTR_DELETE(pCurElement); 

    return 0; 
} // ShowList() 
PTR_DELETE wird immer mit einem Nullzeiger aufgerufen => Sinnlos
Nur Idioten halten Ordnung, ein Genie beherrscht das Chaos.[size=7]

[/size]HardFate - Ein Start, Ein Ziel, Viele Wege[size=7]

[/size]Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

12

10.03.2007, 12:29

ich versteh nicht ganz sorry .. ^^

edit:
ok das mit der while schleife leuchtet ein.. da ich ja das letzte element ebenfalls speichere.. das hab ich aber nur noch nicht geändert, weil ich eben auf ein schlimmeres problem gestoßen bin.. ^^
eben das mit dem löschen der elemente ^^


zu PTR_DELETE:
verdammt.. ^^ stimmt +g+
muss ich ändern ^^
aber ein pointer muss trotzdem noch mit delete gelöscht werden oder? erst dann ist der speicher freigegeben wenn ich mich nicht irre ..!?
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

Beliah

Treue Seele

Beiträge: 115

Wohnort: Söhlde - LK Hildesheim

Beruf: FI-Anwendungsentwicklung

  • Private Nachricht senden

13

10.03.2007, 12:33

Zitat von »"$nooc"«

ich versteh nicht ganz sorry .. ^^


Also, die Ressourcenlecks sind doch eigtl. sehr offensichtlich.
Debuggers don't remove bugs, they only show them in slow motion.

Google Suche ohne Werbung und Cookies: Scroogle

Derzeitige(s) Freizeitprojekt(e)

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

14

10.03.2007, 12:36

Zitat von »"Beliah"«

Zitat von »"$nooc"«

ich versteh nicht ganz sorry .. ^^


Also, die Ressourcenlecks sind doch eigtl. sehr offensichtlich.


das erste verstehe ich nicht so ganz...

das mit der while schleife ist logisch.. verstehe ich ..

das nächste leck leuchtet mir auch ein.. ich muss dann pCurElement löschen ...

und das letzte mit PTR_DELETE geht mich auch ein .. aber muss ich pCurElement noch deleten? schon oder?
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

big_muff

Alter Hase

Beiträge: 460

Wohnort: Schweiz

Beruf: Informatikstudent (4. Semester)

  • Private Nachricht senden

15

10.03.2007, 12:36

Ich seh da ganz viele Ressourcenlecks. Ich glaube du hast da was mit den Zeigern nicht verstanden. Sehen wir uns mal diesen Code an:

C-/C++-Quelltext

1
2
3
4
   Element *pCurElement; 
    pCurElement = new Element;

    pCurElement = m_pPtrToFirstElement;

Mit new reservierst du irgendwo Speicher in der Grösse eines Element. pCurElement zeigt dann auf diesen Speicher. Wenn du nun pCurElement auf das erste Element zeigen lässt. Dann zeigt pCurElement nicht mehr auf den reservierten Speicher und du hast keine Möglichkeit mehr den reservierten Speicher freizugeben. Du musst nicht für jeden Zeiger ein new aufrufen....
Genau das gleiche Problem ist beim dritten Codeausschnitt von mir oben

Zitat von »"$nooc"«

aber muss ich pCurElement noch deleten? schon oder?
Du musst erst gar nie Speicher dafür reservieren. Liess im C++-Buch deiner Wahl doch noch mal etwas über Zeiger...
Nur Idioten halten Ordnung, ein Genie beherrscht das Chaos.[size=7]

[/size]HardFate - Ein Start, Ein Ziel, Viele Wege[size=7]

[/size]Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

16

10.03.2007, 12:42

omg du hast recht :D
wie konnte ich da nicht durchblicken.. is ja logisch.. wenn ich dann den zeiger wo anders hinzeigen lasse, dann kann ich den speicher den ich ursprünglich mal reserviert habe nie mehr freigeben ^^

danke danke :)
ich werde das sofort überarbeiten !
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

big_muff

Alter Hase

Beiträge: 460

Wohnort: Schweiz

Beruf: Informatikstudent (4. Semester)

  • Private Nachricht senden

17

10.03.2007, 12:44

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
template<class T> 
void PTR_DELETE(T &pPtr) 
{ 
    if(pPtr != NULL) 
    { 
        pPtr = NULL; 
        delete pPtr;    
    } 
} // PTR_DELETE() 

Ganz böse was du hier machst...
Zuerst setzt du den Zeiger auf NULL und dann löschst du ihn. Die Reihenfolge ist da nicht ganz richtig. Bei solchen Funktionen dürfen dir solche Fehler nicht unterlaufen. Mit dieser Funktion wirst du NIE IRGENDWELCHEN SPEICHER FREIGEBEN!!!

Zweitens hast du keine Garantie, dass T ein Zeiger ist. Man könnte PTR_DELETE also auch mit einem int aufrufen und das kommt dann mit dem delete nicht so toll... (Wahrscheindlich wird das zwar gar nicht kompiliert aber mach den Funktionskopf besser so

C-/C++-Quelltext

1
void PTR_DELETE(T* &pPtr) 
Nur Idioten halten Ordnung, ein Genie beherrscht das Chaos.[size=7]

[/size]HardFate - Ein Start, Ein Ziel, Viele Wege[size=7]

[/size]Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

18

10.03.2007, 12:45

wie sollte die funktion dann aussehn?
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

Beliah

Treue Seele

Beiträge: 115

Wohnort: Söhlde - LK Hildesheim

Beruf: FI-Anwendungsentwicklung

  • Private Nachricht senden

19

10.03.2007, 12:48

Zitat von »"$nooc"«

wie sollte die funktion dann aussehn?


big_muff meint das du die beiden Befehle vertauschen sollst. Erst löschen und dann auf NULL setzen.
Debuggers don't remove bugs, they only show them in slow motion.

Google Suche ohne Werbung und Cookies: Scroogle

Derzeitige(s) Freizeitprojekt(e)

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

20

10.03.2007, 12:48

wie sieht es damit aus?

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
template<class T>
void PTR_DELETE(T &pPtr)
{
    if(pPtr != NULL)
    {       
        delete pPtr;
        pPtr = NULL;
    }
    else
    { delete pPtr; }
} // PTR_DELETE()

kann aber auch nicht sein oder? weil ich kann einen pointer aj nur mit delete freigeben, wenn ich ihn mit new instanziert habe oder?

edit*
das hab ich sowieso nie so ganz verstanden wieso ich zuerst deleten muss und dann erst auf null setzen.. nach meiner logisch sollte es ja nicht gehn etwas auf null zu setzen, was es nicht mehr gibt.. ^^
aber naja.. wenns nicht anders geht +g+
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

Werbeanzeige