Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

fuite memoire introuvable


Sujet :

Langage C++

  1. #1
    Membre régulier
    fuite memoire introuvable
    je crée un clone de minecraft, mais j'ai une fuite de mémoire
    les chunks sont alloué dans une thread pool dynamiquement
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void ChunkThreadPool::loop(int id)
    {
        while(running)
        {
            sf::sleep(sf::milliseconds(50));
            if(threads[id].state==1)
            {
                threads[id].output = new Chunk(threads[id].input);
                threads[id].state=2;
            }
        }
    }

    puis le pointeur est mis dans une unordered map
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void World::loadGenerated()
    {
        for(unsigned int i=0;i<generated.size();i++)
        {
            ivec3 pos=generated[i]->Getpos();
            generated[i]->buildMesh();
            chunkMap[pos]=generated[i];
            clipChunkMesh(pos);
            generated[i]->GetMesh()->setBuffers();
        }
        generated.clear();
    }

    puis libéré
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void World::unloadChunks(vec3 pos)
    {
        ivec3 key;
        for(std::pair<ivec3,Chunk*> element : chunkMap)
        {
            key=element.first;
            if(key.x-(pos.x/32)>3 || key.x-(pos.x/32)<-3 || key.y-(pos.y/32)>3 || key.y-(pos.y/32)<-3 || key.z-(pos.z/32)>3 || key.z-(pos.z/32)<-3)
            {
                delete element.second;
                chunkMap.erase(key);
            }
        }
    }

    mais j'ai une fuite de mémoire, ca prend de plus en plus mémoire quand je génère des chunks
    Quelqu'un aurai une idée?
    quel serai le meilleurs moyen de debugger ca?(Windows CodeBlocks)

  2. #2
    Rédacteur/Modérateur

    Le meilleur moyen de s'en débarrasser, et d'améliorer la qualité de son code, c'est d'utiliser std::unique_ptr.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre régulier
    je vais essayer unique ptr

  4. #4
    Modérateur

    Hello,

    mais j'ai une fuite de mémoire, ca prend de plus en plus mémoire quand je génère des chunks
    Comment sais-tu qu'il y a une fuite mémoire ?

    Une bonne façon de traquer ce genre de problème est d'utiliser des outils comme valgrind ou dr memory.

    Bon courage !

  5. #5
    Membre régulier
    j'ai essayé unique ptr mais je crois que j'ai toujours la fuite de memoire,la memoire utilisé monte quand je genere des chunks et d'autres bug en plus,je vais essayer de fixer ca
    valgrind est seulement dispo sur linux,j'ai essayé dr memory mais il ne pouvais pas se lancer
    ce qu'il me faudrait c'est qqchose pour mesurer assez precisement la ram alloué mais j'ai pas vraiment trouvé

  6. #6
    Rédacteur/Modérateur

    Faut dire que je vois pas le rapport entre une collection threads sur laquelle tu alloues le membres output et une collection generated que tu parses.
    unique_ptr va éviter les fuites mémoires, si elles sont dûes à des pointeurs dont tu perds le contrôle.
    Sinon pour tracker les allocations, il faut surcharger l'allocateur, et logger les allocations.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  7. #7
    Membre régulier
    finalement c'etait les buffers opengl que je réallouait pas correctement et un buffer que je supprimait pas

###raw>template_hook.ano_emploi###