Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: [Résolu]bad_alloc avec une classe héritant de Drawable  (Lu 2802 fois)

0 Membres et 1 Invité sur ce sujet

Develog

  • Full Member
  • ***
  • Messages: 100
    • Voir le profil
    • E-mail
[Résolu]bad_alloc avec une classe héritant de Drawable
« le: Septembre 11, 2015, 03:43:03 pm »
Bonjour,

Je me trouve confronté à un problème assez important. J'ai une classe "Button" que j'utilise pour créer des boutons à partir de RectangleShape que j'utilise depuis SFML 2.0, je suis pas récemment sur SFML 2.3 et depuis ma classe (dont je n'ai rien changé) me sort des bad_alloc de temps à autres.
J'ai essayé de voir d'où venait ces bad_alloc avec le debbuger mais je n'ai rien trouvé.
Des fois tout fonctionne correctement et d'autres fois impossible de lancer le programme sans avoir ce bad_alloc.

Et je suis persuadé que l'erreur vient de cette classe car si je ne l'appelle pas dans mon main tout se passe bien.


Voici ma classe Button :

#include "Button.h"

Button::Button()
{
    if (!font.loadFromFile("Resources/Hyperspace.ttf"))
    {
        std::cout << "erreur font" << std::endl;
    }
    button_text.setFont(font);
}

Button::~Button()
{

}

Button::Button(int width, int height, int posX, int posY, int r, int g, int b, bool shadow, std::string text)
{
    if (!font.loadFromFile("Resources/Hyperspace.ttf"))
    {
        std::cout << "erreur font" << std::endl;
    }
    button_text.setFont(font);

    button.setSize(sf::Vector2f(width, height));
    button.setPosition(posX, posY);
    button.setFillColor(sf::Color(r,g,b));

    button_GB = button.getGlobalBounds();

    button_text.setCharacterSize(100);
    button_text.setString(text);
    button_text.setColor(sf::Color::White);

    text_GB = button_text.getGlobalBounds();
    button_text.setPosition(posX + ((width - text_GB.width)/ 2) , posY + ((height - text_GB.height)/ 2 - (text_GB.height / 2)));

    if (shadow == true)
    {
        button_shadow.setSize(sf::Vector2f(width, height));
        button_shadow.setPosition(posX + 2, posY + 2);
        button_shadow.setFillColor(sf::Color(r,g,b-80));
    }
}



void Button::setSize(int width, int height)
{
    m_width = width;
    m_height = height;
    button.setSize(sf::Vector2f(width, height));
    button_GB = button.getGlobalBounds();
}

void Button::setPosition(int posX, int posY)
{
    m_posX = posX;
    m_posY = posY;
    button.setPosition(posX, posY);
    button_GB = button.getGlobalBounds();
}

void Button::setColor(int red, int green, int blue)
{
    m_red = red;
    m_green = green;
    m_blue = blue;
    button.setFillColor(sf::Color(red,green,blue));
}

void Button::setText(string text)
{
    m_text = text;
    button_text.setCharacterSize(20);
    button_text.setString(text);
    button_text.setColor(sf::Color::White);

    text_GB = button_text.getGlobalBounds();
    button_text.setPosition(m_posX + ((m_width - text_GB.width)/ 2) , m_posY + ((m_height - text_GB.height)/ 2 - (text_GB.height / 2)));
}

void Button::setShadow(bool activate)
{
    if (activate == true)
    {
        button_shadow.setSize(sf::Vector2f(m_width, m_height));
        button_shadow.setPosition(m_posX + 2, m_posY + 2);
        button_shadow.setFillColor(sf::Color(m_red, m_green, m_blue-80));
    }
}

void Button::setSprite(string filepath)
{
    if (!button_spr_texture.loadFromFile(filepath))
    {
        std::cout << "erreur texture button" << std::endl;
    }
    button.setTexture(&button_spr_texture);
}

bool Button::isClicked(sf::Event *event, sf::Vector2f *worldPos)
{
    if((event->type == sf::Event::MouseButtonPressed) && (event->mouseButton.button == sf::Mouse::Left) && (button_GB.contains(worldPos->x, worldPos->y)))
    {
        return true;
    }
    else
    {
        return false;
    }
}

int Button::getWidth()
{
    return m_width;
}

int Button::getHeight()
{
    return m_height;
}
 

Le header :

#ifndef BUTTON_H
#define BUTTON_H

#include <SFML/Graphics.hpp>
#include <iostream>

using namespace std;

class Button : public sf::Drawable
{
    public:
        Button(int width, int height, int posX, int posY, int r, int g, int b, bool shadow, std::string text);
        Button();
        ~Button();

        void setSize(int width, int height);
        void setPosition(int posX, int posY);
        void setColor(int red, int green, int blue);
        void setText(string text);
        void setShadow(bool activate);
        void setSprite(string filepath);

        int getWidth();
        int getHeight();

        bool isClicked(sf::Event *event, sf::Vector2f *worldPos);

    private:

        virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const
        {
            target.draw(button_shadow, states);
            target.draw(button, states);
            target.draw(button_text, states);
        }

        int m_width = 0;
        int m_height = 0;
        int m_posX = 0;
        int m_posY = 0;
        int m_red = 0;
        int m_green = 0;
        int m_blue = 0;
        string m_text = "";
        bool m_activate = false;

        sf::RectangleShape button;
        sf::RectangleShape button_shadow;

        sf::Text button_text;

        sf::FloatRect text_GB;
        sf::FloatRect button_GB;

        sf::Font font;

        sf::Texture button_spr_texture;
};

#endif // BUTTON_H
 

Et pour appeler cette classe je fais tout simplement Button Button1; Et ensuite j'appelle les fonctions si besoin.
Et là je ne vois pas d'où peut venir le problème.

Merci d'avance.
« Modifié: Septembre 17, 2015, 11:09:38 pm par Develog »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : bad_alloc avec une classe héritant de Drawable
« Réponse #1 le: Septembre 11, 2015, 03:49:23 pm »
Quel OS ?
Quel compilateur ?
Quelle version de SFML (la variante exacte) ?

Citer
J'ai essayé de voir d'où venait ces bad_alloc avec le debbuger mais je n'ai rien trouvé.
Bah il devrait tout de même pointer vers la ligne qui provoque l'erreur...
Laurent Gomila - SFML developer

Develog

  • Full Member
  • ***
  • Messages: 100
    • Voir le profil
    • E-mail
Re : bad_alloc avec une classe héritant de Drawable
« Réponse #2 le: Septembre 11, 2015, 04:02:05 pm »
Windows 8.1 64 bits
MinGW 4.9.2
Il semblerait que ce soit SFML 2.3 sans aucune variante ...

Et bien non ... Le problème c'est que même avec seulement un sf::RectangleShape et un draw j'ai ce bad_alloc ...

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : bad_alloc avec une classe héritant de Drawable
« Réponse #3 le: Septembre 11, 2015, 04:30:00 pm »
Citer
Il semblerait que ce soit SFML 2.3 sans aucune variante ...
Ce que je veux dire, c'est quelle archive as-tu choisie sur la page de téléchargements (ou alors l'as-tu compilée toi-même ?) ?

Citer
Et bien non ... Le problème c'est que même avec seulement un sf::RectangleShape et un draw j'ai ce bad_alloc ...
Dans ce cas fournis un code complet minimal qui reproduit le problème. Mais ça sent l'incompatibilité entre ton compilo et la version téléchargée.

Et... apprends à te servir de ton debugger, vraiment :P
Laurent Gomila - SFML developer

Develog

  • Full Member
  • ***
  • Messages: 100
    • Voir le profil
    • E-mail
Re : bad_alloc avec une classe héritant de Drawable
« Réponse #4 le: Septembre 11, 2015, 10:33:42 pm »
J'ai pris l'archive pour Mingw 4.9.2 pour Windows.
Et ce que je ne comprends pas c'est que dans mon programme j'ai déjà utilisé des propriétés sfml tels que les vertex.

Je vais essayer se fournir un morceau de code fonctionnel rapidement.

J'ai essayé mon debugger mais j'ai du mal avec (surement pour ca que je ne trouve pas l'erreur avec ) ... Il faut que je me plonge dedans  :P

Develog

  • Full Member
  • ***
  • Messages: 100
    • Voir le profil
    • E-mail
Re : bad_alloc avec une classe héritant de Drawable
« Réponse #5 le: Septembre 12, 2015, 03:17:11 pm »
Me revoilà en ayant utilisé mon debbuger comme il se doit (enfin je crois ^^)
Donc voilà les erreurs ce que me renvoie le debugger :



Et voici ma fonction :

void Tile::setPosition(int posX, int posY)
{
    _posX = posX;
    _posY = posY;
}
 

Et la fonction qui appelle cette dernière fonction :

void TileMap::Load(int nbrTile)
{
    _nbrTile = nbrTile;
    mapSize = sqrt(_nbrTile);

    if(!textureTile.loadFromFile("Resources/Tileset.png"))
        cout << "Error Texture" << endl;

    tileArray.setPrimitiveType(sf::Quads);



    ///Génération de haut en bas puis de gauche à droite(Inverser la boucle pour avoir de gauche à droite puis de haut en bas)
    for(int i = 0; i < mapSize; i++)
    {
        for(int j = 0; j < mapSize; j++)
        {
            int id = i * mapSize + j;
            map[id].setPosition(i, j);
            map[id].selectTile(0);
            map[id].init(&vertex, &tileArray);
        }
    }
}
 

Et si il faut je peux fournir d'autre truc aussi. Mais je pense que le problème vient d'un de ces endroits :p

Demystificator

  • Newbie
  • *
  • Messages: 40
    • Voir le profil
Re : bad_alloc avec une classe héritant de Drawable
« Réponse #6 le: Septembre 12, 2015, 04:13:41 pm »
C'est donc ta map qui a un problème. Bad Alloc signifiant souvent que ton programme n'a pas réussi à allouer la mémoire pour ton tableau, ça peut venir d'un manque de mémoire, fuite mémoire, ou que tu n'as pas de delete dans ton code.

C'est dur à dire après parce qu'on ne sait même pas d'où sort cette variable map.

Develog

  • Full Member
  • ***
  • Messages: 100
    • Voir le profil
    • E-mail
Re : bad_alloc avec une classe héritant de Drawable
« Réponse #7 le: Septembre 14, 2015, 10:10:01 pm »
Je pense que ce n'est pas un manque de mémoire ou même une fuite car même avec un tableau de 50 objets cela me fait ce problème... Et j'ai déjà pu exécuter le programme avec plus de 500 000 objets. 

Ma map est un tableau d'objet. Déclaré dans le header.

Tile * map = new Tile[_nbrTile];

Et le debugger me renvoie une erreur désormais sur mon constructeur de TileMap qui celui-ci est désuet de ligne de code. 

Demystificator

  • Newbie
  • *
  • Messages: 40
    • Voir le profil
Re : bad_alloc avec une classe héritant de Drawable
« Réponse #8 le: Septembre 16, 2015, 02:24:48 am »
Donc si tu alloues ton tableau dans ton header et que tu définis _nbrTile uniquement dans ton cpp ; qui plus est en dehors du constructeur, j'imagine qu'en fait ton programme alloue un tableau de 0 Tiles et après tu essayes d'y accéder.

Enfin si j'imagine bien ton code.

Je pense que ton new devrait être dans ta méthode load(int) et n'oublie pas de le delete.

Develog

  • Full Member
  • ***
  • Messages: 100
    • Voir le profil
    • E-mail
Re : bad_alloc avec une classe héritant de Drawable
« Réponse #9 le: Septembre 17, 2015, 11:09:24 pm »
Merci beaucoup ! Tout fonctionne correctement. Je n'avais pas fait attention à ce détail.

Merci pour votre aide !  :)