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

[ALLEGRO 5] Wyciek pamięci w programie

Ostatnio zmodyfikowano 2014-06-21 16:51
Autor Wiadomość
qest43
Temat założony przez niniejszego użytkownika
[ALLEGRO 5] Wyciek pamięci w programie
» 2014-06-21 15:58:20
Błąd występuję podczas wczytywania mapy. Gdy jest mało elementów do wczytania, program działa poprawnie, natomiast przy większej liczbie elementów mapy do wczytania, program ma problem z wczytaniem pliku Player.txt, gdzie umieszczona jest np. ścieżka do grafiki, no i program crashuje bo nie może wyświetlić grafiki, której nie wczytał. Nie mam pojęcia co może powodować te zamazywanie ścieżek.

Metoda klasy layer, każdy kafelek jest wysyłany tutaj
C/C++
tiles[ tiles.size() - 1 ].SetContent( tileImage, tempState, position );
C/C++
void Layer::LoadContent( std::string layerID, std::string mapID )
{
    std::string filename = "Load/Maps/" + mapID + ".txt";
    fileManager.LoadContent( filename.c_str(), attributes, contents, layerID );
    int indexY = 0;
   
    for( int i = 0; i < attributes.size(); i++ )
    {
        for( int j = 0; j < attributes[ i ].size(); j++ )
        {
            if( attributes[ i ][ j ] == "SolidTiles" )
                 solidTiles.push_back( SetTiles( contents[ i ][ j ] ) );
            else if( attributes[ i ][ j ] == "TileSheet" )
                 tileSheet = al_load_bitmap( contents[ i ][ j ].c_str() );
            else if( attributes[ i ][ j ] == "StartLayer" )
            {
                for( int k = 0; k < contents[ i ].size(); k++ )
                {
                    if( contents[ i ][ k ] != "---" )
                    {
                        ALLEGRO_BITMAP * tileImage;
                        Tile::State tempState = Tile::State::Passive;
                        std::pair < int, int > tile = SetTiles( contents[ i ][ k ] );
                        if( std::find( solidTiles.begin(), solidTiles.end(), tile )
                        != solidTiles.end() )
                        {
                            tempState = Tile::State::Solid;
                        }
                        tileImage = al_create_sub_bitmap( tileSheet, tile.first * 32, tile.second * 32,
                        32, 32 );
                       
                        std::pair < float, float > position( k * 32, indexY * 32 );
                       
                        Tile tileInstance;
                        tiles.push_back( tileInstance );
                        tiles[ tiles.size() - 1 ].SetContent( tileImage, tempState, position );
                    }
                }
                indexY++;
            }
        }
    }
}
Przechodzi wtedy do metody klasy Tile, po usunięciu linijki
C/C++
tileAnimation.LoadContent( tileImage, "", position );
Program nie crashuje.
C/C++
void Tile::SetContent( ALLEGRO_BITMAP * tileImage, State state, std::pair < float, float > position )
{
    image = tileImage;
    this->state = state;
    tileAnimation.LoadContent( tileImage, "", position );
}
No a tak wygląda ta metoda klasy Animation
C/C++
void Animation::LoadContent( ALLEGRO_BITMAP * image, std::string text, std::pair < float, float > position )
{
    this->image = image;
    this->text = text;
    this->position = position;
   
    alpha = 255;
    font = al_load_font( "font1.ttf", 30, NULL );
    sourceRect = image;
    isActive = false;
    ammountOfFrames = std::pair < int, int >( 3, 4 );
    currentFrame = std::pair < int, int >( 1, 0 );
}
Przypominam że program działa poprawnie gdy wczytuje się mniejszą ilość danych. Ścieżki zamazuje jak wczytał z 480 elementów mapy.

Cały projekt:
http://www.speedyshare.com​/Xe5Wa/RPG.rar
Kompilowany na VS 2012
P-112464
pekfos
» 2014-06-21 16:12:15
contents ma co najmniej tyle elementów, co attributes?

no i program crashuje bo nie może wyświetlić grafiki, której nie wczytał.
To ma być uzasadniony powód do crasha? Powinieneś był to zabezpieczyć, bo brakujące pliki to nie jest nic nadzwyczajnego.
P-112465
qest43
Temat założony przez niniejszego użytkownika
» 2014-06-21 16:51:54
Contents ma zawsze albo tyle samo, albo więcej od Attributes.

Plik menu:
C/C++
Load =[ Title ]

Load =[ Position ][ Axis ][ Font ][ Animation ]
[ 0 0 ][ 2 ][ Font1 ][ Fade ]

Load =[ Image ]
[ Data / Images / Menu / background.png ]

Load =[ Item ][ ItemLink ]
[ New Game ][ GameplayScreen ]
[ Exit ][ SplashScreen ]

EndLoad =[ Title ]

Menager plików wczytuje każdy Load= jako Attributes, ale nie zwiększy go o 1, jeśli pod spodem nie ma Contents.
Czyli w tym przypadku Attributes bedzie miało 3 (3 Load=, gdzie pod spodem jest Contents).

Plik mapy:

C/C++
Load =[ Layer1 ]

Load =[ SolidTiles ]
[ 2, 0 ]
[ 1, 0 ]

Load =[ TileSheet ]
[ TileSheets / tilesheet.png ]

Load =[ StartLayer ]
[ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ]
[ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ]
[ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ]
[ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ][ --- ]
[ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ]
[ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ]
[ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ]
[ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ]
[ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ]
[ 0, 0 ][ 1, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ]
[ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ][ 2, 0 ][ 2, 0 ][ 0, 0 ]

EndLoad =[ Layer1 ]

Jak widać Contents załaduje się znacznie więcej od Attributes.

Tyle danych jest jeszcze w stanie wczytać, ale jak by wkleić parę razy jeszcze te kaflę, to wtedy nie wczytuje już danych z pliku player.

Metoda Wczytywania danych z pliku:

C/C++
void FileManager::LoadContent( const char * filename,
std::vector < std::vector < std::string > > & attributes,
std::vector < std::vector < std::string > > & contents, std::string identifier )
{
    std::string line;
    std::string newLine;
   
    std::cout << filename << std::endl;
   
    std::ifstream openfile( filename );
    if( openfile.is_open() )
    {
        while( !openfile.eof() )
        {
            std::stringstream str;
            std::getline( openfile, line );
           
            if( line.find( "EndLoad=" ) != std::string::npos &&
            line.find( identifier ) != std::string::npos )
            {
                identifierFound = false;
                break;
            }
            else if( line.find( "Load=" ) != std::string::npos &&
            line.find( identifier ) != std::string::npos )
            {
                identifierFound = true;
                continue;
            }
           
            if( identifierFound )
            {
                if( line.find( "Load=" ) != std::string::npos )
                {
                    type = Attributes;
                    line = line.erase( 0, line.find( "=" ) + 1 );
                    tempAttributes.clear();
                }
                else
                {
                    type = Contents;
                    tempContents.clear();
                }
               
                str << line;
               
                while( std::getline( str, newLine, ']' ) )
                {
                    newLine.erase( std::remove( newLine.begin(), newLine.end(), '[' ),
                    newLine.end() );
                   
                    std::string erase = " \t\n\r";
                   
                    newLine.erase( newLine.find_last_not_of( erase ) + 1 );
                   
                    if( type == Attributes )
                         tempAttributes.push_back( newLine );
                    else
                         tempContents.push_back( newLine );
                   
                    std::cout << newLine << std::endl;
                }
                if( type == Contents && tempContents.size() > 0 )
                {
                    attributes.push_back( tempAttributes );
                    contents.push_back( tempContents );
                    std::cout << "att" << attributes.size() - 1 << std::endl;
                }
            }
        }
    }
    else
    {
    }
}
P-112467
« 1 »
  Strona 1 z 1