[C++] Errore deallocazione

di Anonimizzato8480 il
8 risposte
Salve, ho un problema. Sembra essere un errore di deallocazione poichè l'array World mi funziona per tutto il programma, ma alla fine il programma prima di chiudersi si blocca. Ecco il codice:

InitGame():
HRESULT InitGame(void) {
    static int i, j, k;
    static MSG msg;
    static long lTime;
    static D3DMATERIAL9 Mtrl;

    srand(time(NULL));

    ZeroMemory(&Mtrl, sizeof(D3DATERIAL9));
    ZeroMemory(&msg, sizeof(msg));

    Mtrl.Ambient.r = Mtrl.Diffuse.r = 1.0f;
    Mtrl.Ambient.g = Mtrl.Diffuse.g = 1.0f;
    Mtrl.Ambient.b = Mtrl.Diffuse.b = 1.0f;

    pD3DD -> SetMaterial(&Mtrl);

    pD3DD -> SetRenderState(D3DRS_LIGHTING, TRUE);
    pD3DD -> SetRenderState(D3DRS_AMBIENT, 0x00080808);
    pD3DD -> SetRenderState(D3DRS_FOGENABLE, FALSE);

    State = S_LOADING;
    FPS = 30;
    lTime = clock();

    xTransCamera = (float)xd / 2.0f;
    zTransCamera = (float)zd / 2.0f;

    // BEGIN ENGINE

    if (IfFirstTime == TRUE) {
        if (FAILED(InitMesh())) return E_FAIL;
        World = new WORLD**[xd];
        for (i = 0; i < xd; i++) {
            World[i] = new WORLD*[yd];
            for (j = 0; j < yd; j++) {
                if (clock() >= lTime + (long)(1000.0f / 30.0f)) {
                    if (FAILED(DrawD3DScene())) return E_FAIL;
                    lTime = clock();

                    SetupKeys();

                    if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
                        TranslateMessage(&msg);
                        DispatchMessage(&msg);

                        if (msg.message == WM_QUIT) {
                            PostQuitMessage(0);
                            return S_OK;
                        }
                    }
                }
                World[i][j] = new WORLD[zd];
            }
        }
        IfFirstTime = FALSE;
    }

    /*

        Ecc...

    */
    return S_OK;
}
KillD3DWindow():
HRESULT KillD3DWindow(HWND hWnd) {
    static int i, j;

    for (i = 0; i < xd; i++) {
        for (j = 0; j < yd; j++) {
            delete[] World[i][j];
        }
        delete[] World[i];
    }
    delete[] World;

    /*

        Ecc...

    */

    return S_OK;
}
WORLD è una struct formata da due BYTE (Value e Options). xd, yd e zd sono le dimensioni impostate del mondo (xd = zd = 200, yd = 50). pD3DD è il device Direct3D (che non vi interessa). State è lo stato del gioco (usato in DrawD3DScene()). FPS sono i FPS. xTransCamera, yTransCamera e zTransCamera sono la posizione della telecamera. IfFirstTime è una variabile che non vi interessa. World è l'array di WORLD con dimensioni xd, yd e zd, dove riscontro il problema.

Debug:
0 - 7C911231 - ntdll!DbgUiConnectToDbg() - C:\WINDOWS\sy... -
1 - 7C97C943 - ntdll!RtlpNtMakeTemporaryKey() - C:\WINDOWS\sy... -
2 - 7C96DB9C - ntdll!RtlZeroHeap() - C:\WINDOWS\sy... -
3 - 00000000 - 0x093aafa0 in ??() -  -
4 - 00000000 - 0x093aafa0 in ??() -  -
5 - 00000000 - 0x003f0000 in ??() -  -
6 - 00000000 - 0x093aafa0 in ??() -  -
7 - 00000000 - 0x0022fbd4 in ??() -  -
8 - 7C97CD11 - ntdll!RtlpNtMakeTemporaryKey() - C:\WINDOWS\sy... -
Qualche suggerimento?

8 Risposte

  • PS: Il debug non mi segna nessuna linea e per questo che ho chiesto qui.
  • :'(
  • Mi spiace ma non so aiutarti questo è il problema di chi è molto bravo a programmare xD ovvero trovare qualcuno abbastanza bravo da risolvere i problemi che incontri xD

    off ps: prima di programmare fai l'algoritmo del programma su carta!?!
  • No l'errore rimane anche nel computer di mia sorella ed inoltre ho usato una vector ma l'errore persiste... quindi è la deallocazione di qualcos'altro... vedo adesso
  • Al momento dell'errore vedi il callStack del debugger. Se non ci sono chiamate riferito al tuo codice metti dei breakpoint nei distruttori e controlla i passaggi una riga alla volta.
  • Ok...
  • Problema non e in deallocazione del 'World'. Gli pointers dell 'World' sono statti daneggiati da sovrascrittura dei dati perche te, o hai scritto negli variabili che sono gia deallocati; o problema e che la scrittura e eseguita nel qualche array che non e sufficentamente grande.
Devi accedere o registrarti per scrivere nel forum
8 risposte