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

Langage C++ Discussion :

Operateur new qui plante


Sujet :

Langage C++

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 396
    Par défaut Operateur new qui plante
    Bonjour,

    J'ai ce code source qui plante à l'exécution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::string test =  ConfigService::instance()->getStringValue("skybox.XNegative");
    Apparement, mon programme ne rentre même pas dans la méthode 'instance()' ni dans 'getStringValue()'. J'ai l'impression qu'il plante à la création de la string 'skybox.XNegative' !

    Voici la stacktrace que j'ai en debug: http://imageshack.us/photo/my-images/832/debugv.png/
    Pour info, j'ai encore plein de mémoire vive de libre sur mon PC, donc il ne devrait pas y avoir de problème pour allouer cette mini string.

    Une idée d'où peut venir cette erreur étrange ?

    Merci d'avance.
    Grégory

    Edit: même erreur avec le code suivant 'std::string a = "skybox.XNegative";'.
    A mon avis l'erreur vient d'autre part mais je ne sais pas où ni quoi chercher.

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,

    A mon avis, l'erreur vient de new Image*[6] et (probablement) ses autres petits copains : un écrasement mémoire, un double delete, etc... => bref, std::vector, std::unique_ptr (ou boost::shared_ptr si pas d'unique_ptr dispo).

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 396
    Par défaut
    Merci pour votre réponse:
    - A mon avis l'erreur ne vient pas de 'new Image*[6]', ce code source fonctionne depuis des mois
    - Entièrement d'accord pour le std::vector.

    Je viens de faire un rollback de mes dernières modifications en date et quand je supprime un attribut (unsigned int) d'une de mes classes (Camera), le programme s'éxécute correctement.

    Par contre Valgrind détecte quand même une erreur quand le programme fonctionne correctement:
    ==16634== Invalid write of size 4
    ==16634== at 0x4100B50: cortex::FreeCamera::FreeCamera(float, float, float) (FreeCamera.cpp:26)
    ==16634== by 0x804CB99: MyCamera::MyCamera(float, float, float, QWidget const*) (GLWidget.cpp:11)
    ==16634== by 0x804CEA0: GLWidget::initializeGL() (GLWidget.cpp:51)
    ==16634== by 0x41885AF: QGLWidget::glInit() (qgl.cpp:4490)
    ==16634== by 0x41FD0B2: QGLWidget::resizeEvent(QResizeEvent*) (qgl_x11.cpp:1440)
    ==16634== by 0x4403F79: QWidget::event(QEvent*) (qwidget.cpp:8449)
    ==16634== by 0x418DFE1: QGLWidget::event(QEvent*) (qgl.cpp:4302)
    ==16634== by 0x43A9D53: QApplicationPrivate::notify_helper(QObject*, QEvent*) (qapplication.cpp:4486)
    ==16634== by 0x43AF1A7: QApplication::notify(QObject*, QEvent*) (qapplication.cpp:4451)
    ==16634== Address 0x97ccce0 is 0 bytes after a block of size 248 alloc'd
    ==16634== at 0x402842F: operator new(unsigned int) (vg_replace_malloc.c:255)
    ==16634== by 0x804CE71: GLWidget::initializeGL() (GLWidget.cpp:51)
    ==16634== by 0x41885AF: QGLWidget::glInit() (qgl.cpp:4490)
    ==16634== by 0x41FD0B2: QGLWidget::resizeEvent(QResizeEvent*) (qgl_x11.cpp:1440)
    ==16634== by 0x4403F79: QWidget::event(QEvent*) (qwidget.cpp:8449)
    ==16634== by 0x418DFE1: QGLWidget::event(QEvent*) (qgl.cpp:4302)
    ==16634== by 0x43A9D53: QApplicationPrivate::notify_helper(QObject*, QEvent*) (qapplication.cpp:4486)
    ==16634== by 0x43AF1A7: QApplication::notify(QObject*, QEvent*) (qapplication.cpp:4451)
    Ligne 51 de GLWidget: MyCamera *camera = new MyCamera(60.0f, 0.1f, 1000.0f, static_cast<QWidget*>(this->parent()));
    => Rien d'étrange à mes yeux. Si je supprime le dernier argument, j'ai le même problème.

    Ligne 26 de FreeCamera: speed = ConfigService::instance()->getFloatValue("freeCamera.defaultSpeed");
    => J'ai du mal à comprendre Valgrind: 'Invalid write of size 4'.

    Bref, je suis totalement perdu et je ne sais plus où chercher
    Mon programme a fonctionné pendant des mois et quand j'ajoute quelques attributs à une classe: boum.
    A ce que je sache, on est pas limité en nombre d'attributs pour une classe. Ma classe Camera (et ses fils: FreeCamera & MyCamera) ont: 2 bool, 52 float, 2 ptr, 14 int.

  4. #4
    Membre Expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Par défaut
    A mon avis l'erreur ne vient pas de 'new Image*[6]', ce code source fonctionne depuis des mois

    Ca ne veut rien dire, et c'est le principal danger quand on manipule des pointeurs nus : le problème peu se révéler bien plus tard. En l'occurence, il suffit que la mémoire affectée n'ai jamais été utilisée...jusqu'aà ce qu'un bout de code l'utilisant ai été introduit, des mois plus tard.


    C'est juste une remarque générale, je n'ai pas regardé plus que ça ton problème.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 396
    Par défaut
    Je viens encore de supprimer un autre attribut (unsigned int) à ma classe Camera et Valgrind ne me détecte plus aucune erreur.
    Je pense donc que Valgrind est aussi perdu que moi: il ne sais pas d'où vient l'origine du problème

    Si je comprends bien vos commentaire, ce genre d'erreur peut arriver quand:
    * On tente de déréférencer un pointeur qui contient une valeur aléatoire (pointeur non initialisé/vide)
    * On tente d'accéder a un élément d'un tableau qui est en dehors des limites (array out of bounds)

    Je viens d'oublier explicitement d'initiliser 'texSkybox[0]' (texSkybox = new Image*[6]). Dans ce cas, Valgrind me détecte directement mon problème au moment du déréférencement.

    Je suis totalement perdu: où chercher ? quoi chercher ? avec quoi ?
    Merci d'avance.

  6. #6
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Je me demande si le problème n'est pas lié à une recompilation incomplète, qui ferait que les mêmes objets seraient vu avec des tailles et des données membre différentes selon le bout de code qui y accède. Est-ce que tu peux effacer tout le code généré, et recommencer une compilation à zéro ?
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 396
    Par défaut
    J'avais déjà pensé à ça et donc j'ai déjà recompilé plusieurs fois l'entièreter de mon projet et j'ai toujours le même problème

  8. #8
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    ca ressemble vraiment à un écrasement mémoire. Pourquoi ne pas vouloir utiliser ne serait-ce que des std::vector à la place de tes allocations dynamiques ?

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 396
    Par défaut
    Je viens de commenter un maximum de mon code source. J'ai remplacé les derniers 'char *' qui me restait par des std::string.
    Il ne me reste plus qu'un seul pointeur : je fais un bête 'new' d'un objet...rien de bien méchant.

    La seule particularitée est la suivante:
    - J'ai une classe 'Camera' avec des méthodes virtuel. Cette classe est étendu par 'FreeCamera'. Ensuite je compile ceci dans une library (*.so).
    - Pour finir, j'ai une classe 'MyCamera' qui étends 'FreeCamera' et qui implémente les méthodes virtuel.

    Est-ce qu'il y a des choses particulier à savoir quand on fait un héritage d'une classe qui se trouve dans une library ?

  10. #10
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par zenux Voir le message
    Est-ce qu'il y a des choses particulier à savoir quand on fait un héritage d'une classe qui se trouve dans une library ?
    Rends ta classe de base non copiable.

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 396
    Par défaut
    Je ne comprends pas pourquoi ma classe devrait être non copiable. Qu'est-ce que que ça change d'avoir une classe non copiable dans une library ou pas ? Merci d'avance.

    Pour info: je l'ai rendu non copiable et j'ai tjs le même problème.

  12. #12
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    Citation Envoyé par zenux Voir le message
    Je ne comprends pas pourquoi ma classe devrait être non copiable. Qu'est-ce que que ça change d'avoir une classe non copiable dans une library ou pas ? Merci d'avance.
    L'héritage est rarement compatible avec la copie. Je t'ai demandé de rendre des classes non copiables au cas où dans ton code il y aurait eu une copie (peut être cachée). Cette hypothétique copie aurait pu être cause d'erreur...

    Bon, sinon, peux-tu poster du code ? Ca ira peut être plus vite.

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 396
    Par défaut
    Oui mais quoi poster (j'ai énormément de classe impactés) ? La ligne où Valgrind me dit que j'écris 4 bytes à un endroit où je ne devrait pas ? :

    Voici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    FreeCamera::FreeCamera(float angle, float nearPlane, float farPlane) : Camera(angle, nearPlane, farPlane)
    {
    	ConfigService configService;
    	configService.loadProperties("resources/Config.properties"); //lecture d'un fichier de properties qui est sauvegardé dans une map
     
    	keyFront = configService.getCharValue("freeCamera.defaultKeyFront");
    	keyBack = configService.getCharValue("freeCamera.defaultKeyBack");
    	keyLeft = configService.getCharValue("freeCamera.defaultKeyLeft");  //Ici Valgrind met dit 'Invalid write of size 4'. Il ne met dit rien pour les 2 lignes précédentes !
    	keyRight = configService.getCharValue("freeCamera.defaultKeyRight"); //Idem: erreur Valgrind
     
    	speed = configService.getFloatValue("freeCamera.defaultSpeed");//Idem: erreur Valgrind
    	rotateSpeed = configService.getFloatValue("freeCamera.defaultRotateSpeed"); //Idem: erreur Valgrind
    }
    Pas très utile à mon avis... Si vous voulez d'autre partie du code, n'hésitez pas a me demander.

    Dans mon code source, il n'y a plus d'utilisation de pointeurs sauf pour:
    - faire un new MyCamera(...) : rien de bien méchant
    - les bibliothèques std & QT qui font certainement des 'new' un peu partout

  14. #14
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    A tout hasard, postes le code de ConfigService et celui de FreeCamera et Camera

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 396
    Par défaut
    Voici le code source (merci d'avance d'avoir le courage de tout lire )

    ConfigService.h:
    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
    19
    20
    21
    22
    23
    	class ConfigService : public Singleton<ConfigService>
    	{
    		public:
    			friend class Singleton<ConfigService>;
     
    			void loadProperties(const std::string &);
     
    			int getIntValue(const std::string &) const;
    			unsigned getUnsignedIntValue(const std::string &) const;
    			float getFloatValue(const std::string &) const;
    			std::string getStringValue(const std::string &) const;
    			char getCharValue(const std::string &) const;
     
    			ConfigService(); // j'ai mis le constructeur en public pour ne plus utiliser le pattern 'Singleton' -> tjs la même erreur
    			~ConfigService();
     
    		private:
    			void nextLine(std::ifstream &file, std::string &buffer);
    			void checkState() const;
     
    			std::map<std::string, std::string> properties;
    			bool isInitialized;
    	};
    ConfigService.cpp:
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    	/**
            * Constructor
            */
    	ConfigService::ConfigService() : Singleton<ConfigService>(),
    			isInitialized(false)
    	{
     
    	}
     
    	/**
            * Destructor
            */
    	ConfigService::~ConfigService()
    	{
     
    	}
     
    	/**
            * Reads the next line
            * @param file File stream
            * @param buffer [out] Buffer to fill
            */
    	void ConfigService::nextLine(std::ifstream &file, std::string &buffer)
    	{
    		do
    		{
    			std::getline(file, buffer);
     
    			//delete '\r'
    			int length = buffer.length()-1;
    			if(length >=0 && buffer[length]=='\r')
    			{
    				buffer.resize(length);
    			}
     
    		}while(buffer.length()==0 && !file.eof());
    	}
     
    	/**
             * Check if the service is correctly initialized
             */
    	void ConfigService::checkState() const
    	{
    		if(!isInitialized)
    		{
    			throw Exception("Impossible to get this property: the configuration service hasn't been initialized.");
    		}
    	}
     
    	/**
            * Loads properties from a properties file
            * @param propertiesFile Properties file to load
            */
    	void ConfigService::loadProperties(const std::string &propertiesFile)
    	{
    		std::ifstream file;
    		std::istringstream iss;
     
    		std::string propertyName;
    		std::string equalSign;
    		std::string propertyValue;
     
    		file.open(propertiesFile.c_str(), std::ios::in);
    		if(file.fail())
    		{
    			throw Exception("Cannot open the file " + propertiesFile + ".");
    		}
     
    		do
    		{
    			std::string buffer;
    			nextLine(file, buffer);
     
    			iss.clear(); iss.str(buffer);
    			iss >> propertyName;
     
    			if(buffer.length()==0 || propertyName[0]=='#')
    			{ //empty or commetted line
    				continue;
    			}
     
    			iss >> equalSign >> propertyValue;
    			properties[propertyName] = propertyValue;
    		}while(!file.eof());
     
    		isInitialized=true;
    	}
     
    	/**
            * Returns property value in float
            * @param propertyName Name of the property
            * @return Property value in float
            */
    	float ConfigService::getFloatValue(const std::string &propertyName) const
    	{
    		checkState();
     
    		std::map<std::string, std::string>::const_iterator it = properties.find(propertyName);
    		if(it!=properties.end())
    		{
    			std::istringstream iss(it->second);
    			float value;
    			iss >> value;
    			return value;
    		}
     
    		throw Exception("The property doesn't exist.");
    	}
     
    	/**
            * Returns property value in char
            * @param propertyName Name of the property
            * @return Property value in char
            */
    	char ConfigService::getCharValue(const std::string &propertyName) const
    	{
    		checkState();
     
    		std::map<std::string, std::string>::const_iterator it = properties.find(propertyName);
    		if(it!=properties.end())
    		{
    			return (it->second)[0];
    		}
     
    		throw Exception("The property doesn't exist.");
    	}
    Camera.h:
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    	class Camera
    	{
    		public:
    			Camera(float, float, float);
    			virtual ~Camera();
     
    			void onResize(int, int);
    			virtual void moveMouse(int, int) = 0;
     
    			void useMouseToMoveCamera(bool);
    			bool isUseMouseToMoveCamera() const;
    			void setMouseSensitivity(float);
    			void setDistance(float);
    			void setMaxRotationX(float);
     
    			const Matrix4<float> &getViewMatrix() const;
    			const Matrix4<float> &getProjectionMatrix() const;
    			const Frustum<float> *getFrustum() const;
     
    			const Point3<float> &getPosition() const;
    			const Point3<float> &getView() const;
    			const Vector3<float> &getUp() const;
     
    			void moveTo(const Point3<float> &);
    			void moveX(float);
    			void moveZ(float);
    			void rotate(float, float, float, float);
     
    			virtual void onKeyDown(unsigned int, int, int){};
    			virtual void onKeyUp(unsigned int, int, int){};
    			virtual void moveCamera(){};
     
    			void onMouseMove(int, int);
    			void update();
     
    			#ifdef _DEBUG
    				void drawFrustum(const Matrix4<float> &) const;
    			#endif
     
    		private:
    			Camera(Camera const &);
    			Camera& operator=(Camera const &);
     
    			Matrix4<float> mView, mProjection;
     
    			float angle, nearPlane, farPlane;
    			Frustum<float> *frustum;
     
    			Point3<float> position, view;
    			Vector3<float> up;
    			float currentRotationX, maxRotationX;
    			float distance; //distance between the camera and the rotation point (0 : first person camera | >0 : third person camera)
     
    			bool bUseMouse; //true if the cursor is used to move the camera
    			bool needCameraUpdate; //true if the camera should be updated
     
    			float mouseSensitivity;
    			int middleScreenX, middleScreenY, oldMouseX, oldMouseY;
     
    			#ifdef _DEBUG
    				unsigned int bufferIDs[1], vertexArrayObject;
    				enum //buffer IDs indexes
    				{
    					VAO_VERTEX_POSITION = 0,
    				};
    				enum //shader input
    				{
    					SHADER_VERTEX_POSITION = 0,
    				};
     
    				unsigned int cameraShader;
    				int mProjectionLoc, mViewLoc; //Si je supprime quelques attributs, je n'ai plus de problème !
    			#endif
    	};
    Camera.cpp. La classe est assez grande et je pense que personne ne la lira. Je poste donc que le constructeur (toute façon ça plante quand je fais un new MyCamera):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	Camera::Camera(float angle, float nearPlane, float farPlane)
    	{
     
    	}
    FreeCamera.h
    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
    	class FreeCamera : public Camera
    	{
    		public:
    			FreeCamera(float, float, float);
    			virtual ~FreeCamera();
     
    			void setKeys(unsigned int, unsigned int, unsigned int, unsigned int);
    			void setSpeed(float, float);
     
    			void onKeyDown(unsigned int, int, int);
    			void onKeyUp(unsigned int, int, int);
    			void moveCamera();
     
    		private:
    			unsigned int keyFront, keyBack, keyLeft, keyRight;
    			float speed, rotateSpeed;
    	};
    FreeCamera.cpp (que le constructeur)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    	FreeCamera::FreeCamera(float angle, float nearPlane, float farPlane) : Camera(angle, nearPlane, farPlane)
    	{
    		ConfigService configService;
    		configService.loadProperties("resources/cortexEngineConfig.properties");
     
    		keyFront = configService.getCharValue("freeCamera.defaultKeyFront");
    		keyBack = configService.getCharValue("freeCamera.defaultKeyBack");
    		keyLeft = configService.getCharValue("freeCamera.defaultKeyLeft");
    		keyRight = configService.getCharValue("freeCamera.defaultKeyRight"); //Erreur valgrind
     
    		speed = configService.getFloatValue("freeCamera.defaultSpeed"); //Quand je passe en debug, je peux voir que dans la méthode il me fait bien un 'return 2' (valeur qui se trouve dans le fichier de properties). Par contre, une fois la ligne executée, 'speed' vaut '0' !
    		rotateSpeed = configService.getFloatValue("freeCamera.defaultRotateSpeed");
    	}
    MyCamera.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class MyCamera : public FreeCamera
    {
    	public:
    		MyCamera(float, float, float, const QWidget *);
    		virtual ~MyCamera();
     
    		void moveMouse(int, int);
     
    	private:
    		const QWidget *window;
    };
    MyCamera.cpp:
    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
    MyCamera::MyCamera(float angle, float nearPlane, float farPlane, const QWidget *window) : FreeCamera(angle, nearPlane, farPlane),
    	window(window)
    {
     
    }
     
    MyCamera::~MyCamera()
    {
     
    }
     
    void MyCamera::moveMouse(int x, int y)
    {
     
    }
    Le reste du code source, c'est du QT : je crée un object QGLWidget et dans la méthode initializeGL(), je fais: camera = new MyCamera(60.0f, 0.1f, 1000.0f, NULL);

  16. #16
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    La classe ConfigService me semble très curieuse.
    Tout d'abord elle dérive de Singleton<ConfigService> pourtant son destructeur n'est pas virtuel.

    Ensuite son utilisation dans FreeCamera me rend perplexe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    FreeCamera::FreeCamera(float angle, float nearPlane, float farPlane) : Camera(angle, nearPlane, farPlane)
    {
       ConfigService configService;
       configService.loadProperties("resources/cortexEngineConfig.properties");
       keyFront = configService.getCharValue("freeCamera.defaultKeyFront");
       //...
    }
    J'imagine que l'on dérive une classe T depuis Singleton<T> pour en faire... un singleton. C'est à dire que l'on souhaite imposer une instance unique de ConfigService à l'opposé de ce qui semble être fait dans FreeCamera où une instance temporaire de ConfigService est crée sur la pile, instance qui sera détruit à la fin de la fonction.

    Sans connaitre les détails, j'imaginerais plutôt une utilisation du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    FreeCamera::FreeCamera(float angle, float nearPlane, float farPlane) : Camera(angle, nearPlane, farPlane)
    {
       ConfigService* configService = ConfigService::GetInstance(); // pointeur vers une instance unique
       configService->loadProperties("resources/cortexEngineConfig.properties");
       keyFront = configService->getCharValue("freeCamera.defaultKeyFront");
       //...
    }

  17. #17
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    @Arzar : je pense que c'est pour tracker son problème qu'il a court-circuité le DP singleton (qui après cette lecture devrait le faire réflechir )

    @zenux : je suis perplexe. Les défauts éventuels relèvent plus du design mais ne me semblent pas expliquer ton problème. A tout hasard, compiles-tu avec les mêmes options de compilations ta bibliothèque et ton exécutable ? en particulier la directive de compilation _DEBUG est-elle définie dans les deux cas ?

  18. #18
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 396
    Par défaut
    Hello,

    Comme indiqué en commentaire dans ConfigService.h, j'ai mis les constructeur/destructeur en public afin d'éviter d'utiliser le 'pattern' singleton. On aurait pu supposer que l'erreur venait du design pattern singleton mais c'est pas le cas pcq quand j'utilise ma classe sans 'singleton pattern', j'ai le même problème.
    Je viens de supprimer l'héritage vers Singleton et j'ai toujours le même problème.

    Oui je compile bien dans les deux cas avec l'option "_DEBUG".

  19. #19
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 396
    Par défaut
    Oups, j'ai dit une bise. En fait mon exécutable n'est pas compilé avec "_DEBUG".
    Si je compile mon executable sans "_DEBUG", est-ce que mon compilateur ne verra pas les déclarations "_DEBUG" qui se trouvent dans ma bibliothèque ?

  20. #20
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 396
    Par défaut
    En compilant l'éxécutable avec l'option _DEBUG, je n'ai plus d'erreur Valgrind

    J'était persuadé que la première chose que le compilateur faisait, s'était lire les instructions du preprocessor afin de savoir ce qu'il devait faire et ensuite, elles n'intervenaient plus, non ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Novice] Problème avec Eclipse 3.0.x qui plante
    Par esolarc dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 27/05/2005, 13h22
  2. Programme qui plante
    Par harris_macken dans le forum C++
    Réponses: 1
    Dernier message: 22/05/2005, 23h50
  3. Pc qui plante
    Par tooms2028 dans le forum Ordinateurs
    Réponses: 9
    Dernier message: 19/03/2005, 17h32
  4. [JTextArea] redessin qui plante
    Par phil_ma dans le forum Composants
    Réponses: 3
    Dernier message: 04/01/2005, 05h19
  5. [JDBC]Un new qui renvoie null...
    Par Ditch dans le forum JDBC
    Réponses: 4
    Dernier message: 03/01/2005, 13h14

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