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

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2010
    Messages
    19
    D�tails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 19
    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 confirm�

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

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 033
    Billets dans le blog
    12
    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 :
    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 �prouv�
    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
    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 confirm�

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

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 033
    Billets dans le blog
    12
    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 averti
    Inscrit en
    Juin 2010
    Messages
    19
    D�tails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 19
    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