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

1

25.09.2003, 19:48

new Operator wirft eine Exception

Wie der Titel schon sagt, wirft new bei mir immer eine Exception. Ich bin dem mal nachgegangen und hab geschaut ob es am fehlenden Speicher liegt. Hab noch über 300MB frei und laut Debugger brauch ich aber nur ca 30KB. Daran kann es also nett liegen.

Hier mal einen Code ausschnitt:

Quellcode

1
2
3
4
5
6
7
8
void Terrain::CalculateNormal(Terrain::Vertex* pvVertex)
{
    Game().Log("Calculate vertex normals");

    // Make Indices
    unsigned long* pulFace = new unsigned long[(m_uiWidth-1) * (m_uiDepth-1) * 6];
Game().Log("Test");
    unsigned int index = 0;
Beim Aufruf des new-Operator passiert es. Hatte das Problem auch in dieser Funktion

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void Terrain::MakeTerrain(const unsigned char* pbyHeightmap)
{
    Game().Log("Make terrain vertice");

    TB_PARAM(pbyHeightmap);

    if(D3DDevice()->CreateVertexBuffer(sizeof(Terrain::Vertex)*m_uiWidth*m_uiDepth, D3DUSAGE_DYNAMIC, 
                                       Terrain::Vertex::FVF, D3DPOOL_DEFAULT,
                                       &m_pVertice, 0) != D3D_OK)
        TB_EXCEPT(E_INTERFACE, "Cannot create vertex buffer");

    Terrain::Vertex* pvData;
    m_pVertice->Lock(0, 0, (void**)&pvData, D3DLOCK_DISCARD);

    float fDetailX = m_uiWidth * m_fDetailMapCount;
    float fDetailZ = m_uiDepth * m_fDetailMapCount;
...
}
Hier wurde der new-Operator durch die Erzeugung des Vertex Buffers ersetzt. Der new-Operator war an der selben stelle. Die Methode CalculateNormal wird von dieser Funktion aufgerufen.

Ich komme einfach nett weiter. Wenn ich den new-Operator überlade und in meinem new-Operator malloc aufrufen, liefert er NULL zurück. Hat jemand eine Idee woran es liegen könnte?
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

25.09.2003, 20:15

Welche Exception wird denn geworfen, und passiert es sowohl im Debug- als auch im Release-Modus?

3

25.09.2003, 23:06

Ja das ist ja eines der merkwürdigen dinge. Ich weis nicht welche Exception geworfen wird. Ich weis nur das eine geworfen wird.

Ich poste hier einfach mal den Code der die Exception's aufängt.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInst,
                   char* szCmdLine,
                   int iShow)
{
    try
    {
        Game().Initialise();
        Game().Run();
        Game().Release();
    }
    catch(Exception& exp)
    {
        gtl::string out("Founding a ");
        out << CodeToString(exp.GetCode()) << " Exception!\n";
        out << exp.GetMessage() << "\n";
        out << "File: " << exp.GetFile() << "\nLine: " << exp.GetLine() << "\nFunction: " << exp.GetFunction();

        ShowCursor(true);
        MessageBox(NULL, out.c_str(), "Tower Bombing - Error", MB_OK | MB_ICONEXCLAMATION);
        Game().Release();
    }
    catch(std::bad_alloc& exp)
    {
        gtl::string out;
        out << "Founding bad memory allocation!\nInformation: " << exp.what();

        ShowCursor(true);
        MessageBox(NULL, out.c_str(), "Tower Bombing - Error", MB_OK | MB_ICONEXCLAMATION);
        Game().Release();
    }
    catch(exception& exp)
    {
        gtl::string out;
        out << "Founding exception!\nInformation: " << exp.what();

        ShowCursor(true);
        MessageBox(NULL, out.c_str(), "Tower Bombing - Error", MB_OK | MB_ICONEXCLAMATION);
        Game().Release();
    }
    catch(...)
    {
        ShowCursor(true);
        MessageBox(NULL, "Find an unkown exception.\nNo information available!", "Tower Bombing - Error", MB_OK | MB_ICONEXCLAMATION);
        Game().Release();
    }
      
    return 0;
}
Der erste catch - Block ist eine Exception von mir und kann daher Ignoriert werden. Der dritte catch - Block ist eine Basisklasse für viele Exception Klassen, wie auch für die Klasse std::bad_alloc.

Aber der einzige Aufruf ist der letzte catch-Block der alle Exception's abfängt.

Und es ist sowohl in der Debug als auch in der Release Version.

[Edit]Also wenn ich den Debugger laufen lassen wird komischerweise eine bad_alloc Exception geworfen, ohne Debugger aber nett. Leider hilft mir das jetzt auch nett weiter.[/edit]

[edit die 2te]Hat sich erledigt. Hab den Fehler gefunden. Es war mal wieder so ein dummer verschreib fehler. So wurd in einer Schleife über den Speicher hinaus geschrieben.[/edit]
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Werbeanzeige