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

TrommlBomml

Community-Fossil

  • »TrommlBomml« ist der Autor dieses Themas

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

1

25.06.2008, 13:41

kann delete auf gültigen Zeiger fehlschlagen? [gelöst]

der titel sagt eigentlich alles. und zwar folgendes problem:

beim aufruf eines destruktors wird ein std::vector (der zeiger auf objekte speichert), mit all seinen membern freigegeben wie folgt:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
//m_pScenes ist member von mnSceneManager und so deklariert:

std::vector<mnScene*> m_pScenes;

mnSceneManager::~mnSceneManager()
{
    for(unsigned int i = 0; i < m_pScenes.size(); i++)
    {
        delete m_pScenes[i];
    }
}


der destruktor von mnSceen wird erfolgreich abgearbeitet, aber beim zurückkehren vom destruktor mnScene zu delete wird ein brakepoint getriggert.

dahin gehend kann man doch annehmen, dass der zeiger gültig ist (der debugger bestätigt das, hab auch die werte mal überprüft, alles k).
warum kann dann trotzdem nachdem der destruktor erfolgreich abgeschlossen ist, fehlschlagen?

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

25.06.2008, 13:51

Es wäre hilfreich zu erfahren, wo genau dieser "Brakepoint" (es heißt Breakpoint) getriggert wird.

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

3

25.06.2008, 14:21

Ich würde sagen, dass der Fehler wo anderst liegt.
Oder es wird in delete m_pScenes ein Fehler festgestellt.

TrommlBomml

Community-Fossil

  • »TrommlBomml« ist der Autor dieses Themas

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

4

25.06.2008, 14:29

Zitat von »"David_Scherfgen"«

Es wäre hilfreich zu erfahren, wo genau dieser "Brakepoint" (es heißt Breakpoint) getriggert wird.


C-/C++-Quelltext

1
2
3
4
5
6
7
mnSceneManager::~mnSceneManager() 
{ 
    for(unsigned int i = 0; i < m_pScenes.size(); i++) 
    { 
        delete m_pScenes[i]; //hier breakpoint

    } 
}

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

5

25.06.2008, 14:38

Und wie lautet die Fehlermeldung/Exception?
Welchen Wert hat i?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

25.06.2008, 14:43

was passiert denn im dtor von mnScene?

TrommlBomml

Community-Fossil

  • »TrommlBomml« ist der Autor dieses Themas

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

7

25.06.2008, 15:16

Zitat

Und wie lautet die Fehlermeldung/Exception?


hier:

Zitat von »"Fehlermeldungsfentser"«


Windows has triggered a breakpoint in MoonTestEx.exe.

This may be due to a corruption of the heap, which indicates a bug in MoonTestEx.exe or any of the DLLs it has loaded.

This may also be due to the user pressing F12 while MoonTestEx.exe has focus.

The output window may have more diagnostic information.


und das steht im output:

Zitat von »"Debug Output"«


HEAP[MoonTestEx.exe]: Invalid Address specified to RtlValidateHeap( 00D00000, 00D13330 )
Windows has triggered a breakpoint in MoonTestEx.exe.

This may be due to a corruption of the heap, which indicates a bug in MoonTestEx.exe or any of the DLLs it has loaded.

This may also be due to the user pressing F12 while MoonTestEx.exe has focus.


Zitat von »"David_Scherfgen"«

Welchen Wert hat i?


0. ist auch korrekt, giobt nur eine Scene beim testen.

Zitat von »"dot"«

was passiert denn im dtor von mnScene?


das hier:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
mnScene::~mnScene()
{
    //Kamera freigeben

    delete m_pCamera;

    //Moveables freigeben

    for(unsigned int i = 0; i < m_vMoveables.size(); i++)
        delete m_vMoveables[i];
    
    //Renderables freigeben

    for(unsigned int i = 0; i < m_vRenderables.size(); i++)
        delete m_vRenderables[i];
}

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

8

25.06.2008, 15:28

Und da drin ist das Problem nicht, oder wie?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

25.06.2008, 15:34

steht eh schon da was passiert ist: Corruption of the Heap.

Du schreibst irgendwo über eine Arraygrenze raus und der Debugger merkt das erst beim delete...

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

10

25.06.2008, 15:58

Frage: wie sieht der Code aus, wo m_pScenes gefüllt wird?

Btw zur Ursprungsfrage: Ja, delete kann dann trotz gültigem Pointer fehlschlagen, wenn der Inhalt hinter dem Pointer nicht per new reserviert wurde.

Werbeanzeige