Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Czyszczenie pamięci

Ostatnio zmodyfikowano 2010-04-25 13:04
Autor Wiadomość
lenrokskate
Temat założony przez niniejszego użytkownika
Czyszczenie pamięci
» 2010-04-24 14:20:31
Piszę sobie silnik pod swoją grę. Projekt (dev): http://wrzut.net/irb6vf6wf7mb/silnik.rar.html

Problem I:
Ustawiłem sprawdzanie czy pamięć się wyczyściła. No i się NIE czyści. Dlaczego?Problem II
Gdy dołącze plik allegro.h wyskakuje błąd o braku funkcji main....
HELP!
P-16330
pekfos
» 2010-04-24 14:24:05
END_OF_MAIN(), coś ci to mówi?
P-16332
lenrokskate
Temat założony przez niniejszego użytkownika
» 2010-04-24 14:29:00
#pekfos

sorry, zagapiłem się xD

a 1 problem?
P-16333
pekfos
» 2010-04-24 14:46:05
nie wiem, nie pobierałem.. Może przy pisaniu sprawdzania też się zagapiłeś..
P-16335
lenrokskate
Temat założony przez niniejszego użytkownika
» 2010-04-24 14:48:19
ironia...?

nie, nie zagapiłem się....

w tym projekcie jest ~~12 plików, nie będę wrzucał każdego
P-16336
DejaVu
» 2010-04-24 18:01:45
To wklej fragment w którym jest to czyszczenie pamięci (lub kod, który ma go czyścić). My mamy przeszukiwać Twój cały projekt?
P-16338
lenrokskate
Temat założony przez niniejszego użytkownika
» 2010-04-25 09:27:42
main.cpp
C/C++
#include <iostream>
#include <allegro.h>
#include "obiekty.h"
#include "wyswtl.h"

using std::cout;
using std::endl;

int main( char * argv[], int argc )
{
    gracz * p = new gracz[ 1 ];
    mob * m = new mob[ 2 ];
    mapa * a = new mapa;
   
    p[ 0 ].gracz::wypelnij( 5, 6, 2, 100, "Player" );
    m[ 0 ].mob::wypelnij( 10, 11, 12, 90, "mob" );
    m[ 1 ].mob::wypelnij( 50, 55, 44, 77, "mob2" );
    a->mapa::utworz( 10, 10 );
   
    if( p == NULL ) return 1;
   
    if( m == NULL ) return 1;
   
    if( a == NULL ) return 1;
   
    wysw( p[ 0 ] );
    cout << endl;
    wysw( m[ 0 ] );
    cout << endl;
    wysw( m[ 1 ] );
    cout << endl;
    wysw( a[ 0 ] );
    cout << endl;
   
    // polimorfizmy (wyswtl.cpp)
   
    system( "PAUSE" );
   
    end:
    destruct( p );
    destruct( m );
    destruct( a );
   
    // polimorfizm do każdego typu (void destruct(mob* wsk)  itp.)
    // definicja w destructor.cpp
   
   
    if(
    p != NULL ||
    m != NULL ||
    a != NULL
    ) { system( "PAUSE" ); }
    return 0;
}
END_OF_MAIN();
destructor.cpp
C/C++
#include "obiekty.h"

void destruct( gracz * wsk )
{
    delete[] wsk;
    wsk = NULL;
}

void destruct( mob * wsk )
{
    delete[] wsk;
    wsk = NULL;
}

void destruct( mapa * wsk )
{
    delete wsk;
    wsk = NULL;
}
obiekty.h
C/C++
#ifndef OBIEKTY_H
#define OBIEKTY_H

#include "gracz.h"
#include "mob.h"
#include "mapa.h"
#include "destructor.h"

#endif // OBIEKTY_H
destructor.h
C/C++
#ifndef DES_H
#define DES_H

void destruct( gracz * wsk );
void destruct( mob * wsk );
void destruct( mapa * wsk );

#endif // DES_H
P-16342
malan
» 2010-04-25 10:43:04
Zainteresował mnie Twój problem trochę i posiedziałem nad nim... Po skompilowaniu tego kodu:
C/C++
#include <iostream>

class Kran
{
public:
    int a;
    Kran() { std::cout << "Tworze" << std::endl; };
};

void napraw_kran( Kran * wsk_na_kran )
{
    delete wsk_na_kran;
    wsk_na_kran = 0;
}

int main()
{
    Kran * KranBle = new Kran;
   
    std::cout << KranBle << std::endl;
    KranBle->a = 1;
    std::cout << KranBle->a << std::endl;
   
    napraw_kran( KranBle );
   
    std::cout << KranBle << std::endl;
    std::cout << KranBle->a;
   
    getchar();
    return 0;
};
... występuje ten sam problem co u Ciebie. Szukałem trochę o delete itd., ale konkretnego nic nie znalazłem, a jedyne co mi się nasuwa na chwilę obecną to to, że obiekty tworzone za pomocą operator new muszą być usuwane operatorem delete w bloku, w którym zostały stworzone.
Więc (nie zaczyna się zdania od więc - wiem):
C/C++
#include <iostream>

int main()
{
    int * wsk = new int;
   
    //...
    {
        int * wsk2 = new int[ 5 ];
       
        //...
       
        delete[] wsk2;
    }
    //...
   
    delete wsk;
    return 0;
}
Pewnie się mylę, ale Iname mnie poprawi (zapewne) :).
P-16345
« 1 » 2
  Strona 1 z 2 Następna strona