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 :

delete []double et std::vector::resize()


Sujet :

C++

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2010
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 19
    Points : 10
    Points
    10
    Par défaut delete []double et std::vector::resize()
    Bonjour à tous,

    J'ai un comportement bizarre lorsque j'essaie de libérer un double *, membre de ma classe.

    Voici les détails :
    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
    //header
    class CPolygon  
    {
    public:
    	CPolygon();
    	virtual ~CPolygon();
     
    	CPolygon( const CPolygon &);
     
    	std::vector<double> pts;
     
    	double* bounds;
    };
     
    //implem
    CPolygon::CPolygon()
    {
    	bounds=0;
    }
     
    CPolygon::~CPolygon()
    {
    	if(bounds)
    	{
    		delete []bounds;
    		bounds=0;
    	}
    }
     
    CPolygon::CPolygon( const CPolygon &poly)
    {
    	if(!bounds)
    		bounds = new double[4];
     
    	if(poly.bounds)
    	{
    		for(int i=0; i<4; i++)
    			this->bounds[i] = poly.bounds[i];
    	}
    }
    Dans une autre classe, je manipule un std::vector<CPolygon> et au moment du resize, ça plante dans le constructeur de copie dans le for() car this->bounds n'est pas correctement initialisé (0xcdcdcd).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    //std::vector<CPolygon> klines
    if(klines.size()==0)
    {
    	CPolygon nullpoly;
     
    	klines.resize(2,nullpoly);
    	...
    }
    Je ne comprends pas ce comportement vu que je pensais avoir tout fait pour allouer correctement mon bounds dans tous les cas.

    Quelqu'un peut-il m'expliquer le soucis ?

    Merci par avance.

  2. #2
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 379
    Points
    11 379
    Billets dans le blog
    10
    Par défaut
    Dans un constructeur, les variables membres ne sont pas initialisées avant que tu ne le fasses (ou que chaque variable ait un constructeur par défaut).
    Donc ton test en entrée de ton constructeur par copie est invalide :
    car 'bounds' n'est pas initialisée. Tu dois donc virer ce test et mettre directement ton initialisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bounds = new double[4];
    Je suppose vu ce bout de code que tu viens du Java, où le constructeur par défaut est appelé au début des autres constructeurs. Sache qu'en C++ ce n'est pas le cas (du moins pas par défaut, et même ainsi pas encore sur tous les compilateurs), tu DOIS initialiser tes variables membres dans tous les constructeurs.
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 59
    Points : 120
    Points
    120
    Par défaut
    salut,

    à mon avis tu devras définir un copy constructor pour ta classe Polygon, où tu fais une duplication mémoire (deep copy) de la variable de type pointer

    celui généré par le compilateur se contente de faire une affectation de variable, ce qui fait qu'elle est doublement détruite

  4. #4
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 379
    Points
    11 379
    Billets dans le blog
    10
    Par défaut
    Euh ... Il l'a déjà écrit son copy constructor ... (avec une erreur, certes, mais quand même) ...
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  5. #5
    Membre à l'essai
    Inscrit en
    Juin 2010
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 19
    Points : 10
    Points
    10
    Par défaut
    Ok tout bêtement.

    Je ne viens pas du Java mais j'ai pas forcément l'habitude de coder des constructeurs par copie du coup j'avais pas forcément bien assimilé le principe.

    Merci bien

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Plantage sur deletion de std::vector
    Par uriotcea dans le forum C++
    Réponses: 8
    Dernier message: 20/02/2012, 21h09
  2. Pointeur sur std::vector casser après un resize()
    Par jerem3000 dans le forum Langage
    Réponses: 3
    Dernier message: 20/01/2012, 00h30
  3. conversion std::vector<double> en std::vector<float>
    Par salseropom dans le forum C++
    Réponses: 10
    Dernier message: 10/06/2010, 10h51
  4. std::vector<>.resize et exception
    Par camboui dans le forum C++
    Réponses: 9
    Dernier message: 09/10/2009, 11h28
  5. delete et std::vector
    Par adurandet dans le forum C++
    Réponses: 9
    Dernier message: 31/10/2007, 16h44

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