IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

C++ Discussion :

Mon programme crash sur un new


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Février 2008
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 112
    Par défaut Mon programme crash sur un new
    Bonjour !
    Je travaille sur un petit jeu et mon problème est que lorsque un niveau est fini par le joueur, j'utilise un "destroySigleton()" puis juste après pour recharger un niveau j'appelle un "GetSingleton()".
    Le programme plante sur le new du "GetSingleton()" quand la variable "instance" est égale à nullptr.

    Que dois je faire ? Est ce que je fais les choses d'une mauvaise façon ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    D3D11Rendering::destroySingleton();
     
            D3D11Rendering* rendering = D3D11Rendering::getInstance();//plante ici dans le getInstance()
     
            debugFile << "before delete rendering" << endl;
     
            if (rendering)
            {
                delete rendering;
                debugFile << "after delete rendering" << endl;
            }

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    A part arrêter de faire des singletons et utiliser des pointeurs intelligents plutôt que de faire des new/delete manuellement, il faudrait nous montrer plus de code pour comprendre le problème

  3. #3
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Bonjour,

    Si un new ne fonctionne pas c'est le plus souvent parce que on a cassé le mécanisme d'allocation. Pour le casser ça peut être dû a des actions telles que :
    - écrire dans une zone allouée en dehors de la zone d'allocation;
    - faire un delete de n'importe quoi;
    - ou d'autres "undefined behaviors".
    Il faut donc voir plus de code pour en dire plus. Mais déjà détruire un singleton pour le recréer n'est pas très habituel comme démarche. Est-ce que la valeur retournée par D3D11Rendering::getInstance() doit/peut être détruite, j'ai des doutes?

  4. #4
    Membre confirmé
    Inscrit en
    Février 2008
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 112
    Par défaut
    J'ai enlevé les singletons pour la classe de rendu (j'utilise un unique_ptr à la place), je les ai laissés pour les autres classes qui en utilise et il semblerait que mon problème ait évolué.
    Mon jeu plante au bout d'une douzaine de niveaux. Est que ça pourrait être dû à une fragmentation de la mémoire et si oui, que dois je faire pour résoudre cela ?
    Je ne sais pas trop quelle partie du code montrer, mais voilà la partie qui gère le passage au niveau suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
            Sounds::getInstance()->playSound(*Sounds::getInstance()->levelWon);
     
     
            Gameplay::afterGameOver = false;
     
            //WaitForSingleObject(Sounds::handlePlaySoundThread, INFINITE);
     
     
            Gameplay::indexLevel++ ;
     
            if (Gameplay::indexLevel > 39 )
                Gameplay::indexLevel = 0;
     
     
     
            D3D11Rendering::rendering.reset();
            D3D11Rendering::rendering = make_unique< D3D11Rendering>();

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Les chances qu'on trouve le crash avec le code que tu fournis (pas) sont proches de 0.
    Cela dit, voir que le renderer est détruit et recréé pour un changement de niveau, ou le nombre de globales que je vois dans ce très court code, ça laisse songeur sur la qualité générale du code et le nombre de bugs qui peuvent se cacher derrière ce crash.
    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.

  6. #6
    Membre confirmé
    Inscrit en
    Février 2008
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 112
    Par défaut
    Dans ce cas comment je devrais faire pour charger le niveau suivant ?

Discussions similaires

  1. [Débutant] Comment tester mon programmes sockets sur ma machine
    Par wilsongamo dans le forum VB.NET
    Réponses: 8
    Dernier message: 26/06/2017, 15h52
  2. Réponses: 3
    Dernier message: 17/05/2008, 14h39
  3. votre avis sur mon programme
    Par warubi dans le forum C++
    Réponses: 6
    Dernier message: 19/02/2007, 09h47
  4. Réponses: 14
    Dernier message: 27/10/2006, 13h08
  5. Réponses: 11
    Dernier message: 17/03/2003, 10h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo