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++

  1. #1
    Membre du Club
    Inscrit en
    Février 2008
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 112
    Points : 43
    Points
    43
    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
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    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 éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 565
    Points : 7 642
    Points
    7 642
    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 du Club
    Inscrit en
    Février 2008
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 112
    Points : 43
    Points
    43
    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 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 963
    Points
    32 963
    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 du Club
    Inscrit en
    Février 2008
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 112
    Points : 43
    Points
    43
    Par défaut
    Dans ce cas comment je devrais faire pour charger le niveau suivant ?

  7. #7
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 612
    Points
    30 612
    Par défaut
    Salut,
    Citation Envoyé par blueLight Voir le message
    Dans ce cas comment je devrais faire pour charger le niveau suivant ?
    La question est : pourquoi veux tu détruire ton instance de D3D11Rendering

    Si j'en crois le nom que tu as donné à cette classe, elle ne devrait s'occuper que d'une seule chose à savoir : le rendu 3D sous DirextX 11. Et les comportements qui s'occupent de ce rendu, les informations manipulées pour y arriver n'ont aucune raison de changer en fonction du niveau de ton jeu: quand tu veux effectuer le rendu, tu devrais fournir au comportement de rendu "un ensemble de données" qui seront utilisées pour effectuer ce rendu et "point barre".

    Quant aux informations qui permettent à ton "système de rendu" d'effectuer ce rendu, elles devraient venir "d'ailleurs" (sans doute du niveau, voir, d'un "système médian" permettant de convertir les données de ton niveau en données de rendu).

    Et, du coup, le passage d'un niveau à l'autre consisterait à se dire que:
    1. je liquide les informations "métier" concernant le niveau terminé
    2. (éventuellement) je liquide les informations de rendu (matériaux, textures, vertex et autres) du niveau terminé
    3. je prend note du fait que je passe au niveau suivant (avec vérifications si besoin) (level++;
    4. je charge les informations "métier" concernant le niveau suivant
    5. (éventuellement) je charge les informations de rendu concernant le niveau suivant
    6. j'utilise tout cela pour la suite du jeu
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  8. #8
    Membre du Club
    Inscrit en
    Février 2008
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 112
    Points : 43
    Points
    43
    Par défaut
    Ok merci pour ta réponse.

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