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 :

Désallouer correctement un tableau d'objets


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 882
    Par défaut Désallouer correctement un tableau d'objets
    Bonjour

    je gallère sur la libération un tableau d'objet.

    j'ai 1 classe mére abstraite avec :
    un tableau d'objet
    un methode init et unload qui alloue et libére le tableau
    et 2 objets derivées qui appel successivement init puis unload

    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
    void Screen::Init(uint8_t NumberOfButton){
    	Serial.print("Init CircleScreen");
     
    	numberOfButton = NumberOfButton;
    	buttons = new RButton*[numberOfButton];
    	/*for (int i = 0; i < numberOfButton; i++)
    	{
    		buttons[i] = new RButton();
    	}*/
    }
     
     
    void Screen::Unload(){
    	Serial.println("unload Screen");
    	Serial.print("buttons number");Serial.println(numberOfButton);
     
    	Serial.println("unload buttons array");
    	/*for (int i = 0; i < numberOfButton; i++)
    	{
    		delete [] buttons[i];
    	}*/
    	delete [] buttons;
     
    	numberOfButton = 0;
    }
    lors de l'appel sur la methode unload sur le deuxieme objet mon programme s'arrete (dernière trace "unload buttons array") et d'ailleur je n'ai pas l'impression que le destructeur de RButton soit appelé.

    autre point je n'ai peux pas utiliser la std.

    Merci

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Bonsoir,

    à chaque new doit correspondre delete
    à chaque new[] doit correspondre delete[]
    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.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 882
    Par défaut
    j'ai modifié mon code sur cette partie et je suis arrivé à une autre erreur

    sur la liberation d'un type char**

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	Serial.println("unloading text");
    	for (int i = 0; i < _numberOfLine; i++)
    	{
    		Serial.print("unloading text line");Serial.println(i);
    		delete [] _textlines[i];
    		Serial.print("unloaded text line");Serial.println(i);
     
    	}
    	delete [] _textlines;
    	Serial.println("unloaded text");
    je m'arrete sur delete [] _textlines[i];, j'ai egalement essayé avec un free

  4. #4
    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 : 50
    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
    Difficile de dire ce qui ne va pas avec le peu de code que tu nous montres.

    Mais globalement, tu ne devrais pas avoir à te poser ce genre de questions. En C++, un tableau de chaînes de caractères, c'est std::vector<std::string>. Et aucune désallocation de mémoire à gérer à la main.
    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.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 882
    Par défaut
    Je vous mettrai plus de code demain, il faut que vérifie mais je pense pas avoir accès à la std::vector

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Ça a été fait, mais la réponse qu'on a eu, c'est:
    Citation Envoyé par jeff_! Voir le message
    il faut que vérifie mais je pense pas avoir accès à la std::vector
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    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 : 50
    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
    Des gens qui auraient accès à new mais pas à std::vector ? Personellement, j'ai du mal à voir de bonnes raisons...
    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.

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par jeff_! Voir le message
    delete [] _textlines[i];
    Ca ressemble un peu trop à l'erreur du premier post pour être une coïncidence...
    Relis vraiment ton code et retiens la simple règle que j'énonce dans mon premier post.
    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.

  9. #9
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Sinon, pense à toujours initialiser tes pointeurs à NULL dans le constructeur, et mets les à NULL après les avoir deleté.

    Je me demande si tu n’essaies pas tout simplement de libérer un pointeur non-alloué, cela te permettra de le vérifier.

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 882
    Par défaut
    Voici le code complet de la classe
    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
    #include "Text.h"
    #include "UTFTFactory.h"
     
     
    RText::RText(uint8_t numberOFLine,Alignement alignement,font* textfont){
     
    	this->_numberOfLine = numberOFLine;
    	this->_alignement = alignement;
    	this->_numberOfLineCounter=0;
     
    	this->_textlines = new char*[_numberOfLine];
    	this->_interligne = 5;
    	for (int i = 0; i < _numberOfLine; i++)
    	{
    		this->_textlines[i] = "";
    	}
    	RUTFT* tft = UTFTFactory::GetInstance();
    	if( textfont == NULL)
    		this->_font = new font(tft->getFont(),new RGB(255,255,255));
    	else
    		this->_font = textfont;
     
    }
    void RText::AddLine(char* line){
    	if( this->_numberOfLineCounter< this->_numberOfLine){
    		_textlines[_numberOfLineCounter] = line;
    		_numberOfLineCounter++;
    	}
    }
    void RText::Write(uint8_t x,uint8_t y,uint8_t width){
    	RUTFT* tft = UTFTFactory::GetInstance();
    	tft->setFont(this-> _font->_font);
    	tft->setColor(this->_font->fontColor->R,this->_font->fontColor->G,this->_font->fontColor->B);
    	uint8_t text_x,text_y;
    	text_y = y + tft->getFontYsize()+_interligne;
    	double Charbyline = ceil(width / tft->getFontXsize());
     
    	for (int i = 0; i < _numberOfLine; i++)
    	{
    		if( strlen(_textlines[i] )<= Charbyline){
    			this->WriteLine(tft,_textlines[i],x,text_y,width);
    		}else{
    			double iteration = ceil(strlen(_textlines[i] )/Charbyline);
    			String str = String(_textlines[i]);
    			for (int i = 0; i < iteration; i=i+Charbyline)
    			{
    				String part = str.substring(i*Charbyline,((i+1)*Charbyline -1));
    				this-> WriteLine(tft,part,x,text_y,width);
    				text_y = text_y+tft->getFontYsize()+_interligne;
    			}
    			str = NULL;
    		}
    		text_y = text_y+tft->getFontYsize()+_interligne;
    	}
    }
     
    void RText::RefreshLine(uint8_t index, char* text){
     
    	if(index < this->_numberOfLine){
    		this->_textlines[index] = text;
    	}
    }
     
     
    void RText::WriteLine(UTFT* tft,String text,uint8_t x ,uint8_t y,uint8_t width){
     
    	char *buf= new char[text.length()+1];
    	text.toCharArray(buf, text.length()+1);
    	WriteLine(tft,buf,x,y,width);
    	free(buf);
    }
     
     
    void RText::WriteLine(UTFT* tft,char* text,uint8_t  x ,uint8_t y,uint8_t width){
     
    	switch (_alignement)
    	{
    	case Alignement_LEFT:
    		break;
    	case Alignement_CENTER:
    		x=	((width/2) - ((strlen(text) * tft->getFontXsize())/2)) + x;
    		break;
    	case Alignement_RIGHT:
    		x = (uint8_t)(width-strlen(text)-1);
    		break;
    	default:
    		break;
    	}			
    	tft->print(text,x,y);
    	free(text);
    }
     
     
    RText::~RText(void)
    {
    	Serial.println("unloading text");
    	for (int i = 0; i < _numberOfLine; i++)
    	{
    		Serial.print("unloading text line");Serial.println(i);
    		delete [] _textlines[i];
    		Serial.print("unloaded text line");Serial.println(i);
     
    	}
    	delete [] _textlines;
    	Serial.println("unloaded text");
     
    }
    a vrais dire je doit être une quiche car je comprends pas la difference dans le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    	int* set = new int[100];
    	//use set[]
    set[0]=1;
    	delete [] set;
    	system("pause");
     
    	char *_test1 =  new char[3];
    	_test1="123";
    	cout << _test1 << endl;
     
    	delete [] _test1;
    sur la tableau d'entier je n'ai aucun soucis mais sur le tableau char ...
    j'ai une erreur du type _Block_Type_Is_Valid(pHead->nblockUse)
    j'avoue que cela me depasse

  11. #11
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Etant donné que tu mets une valeur statique dans ton char*, qui en plus te fait perdre la zone mémoire allouée juste avant, et qu'il est interdit de faire un delete sur quelque chose non allouée dynamiquement, et tu perds l'info de la zone à désallouer.
    Beaucoup trop d'erreur pour si peu de lignes, il faudrait revoir les bases de l'allocation et utilisation mémoire.
    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.

Discussions similaires

  1. retour tableau d'objets par service web axis jboss
    Par TrollMaster dans le forum XML/XSL et SOAP
    Réponses: 6
    Dernier message: 27/11/2005, 21h45
  2. Tableau d'objets
    Par moulefrite dans le forum MFC
    Réponses: 7
    Dernier message: 15/06/2004, 14h14
  3. Sauvegarde / Chargement d'un tableau d'objets
    Par Naruto dans le forum Langage
    Réponses: 3
    Dernier message: 18/05/2004, 14h34
  4. [VB6]Tableau d'objet withevents
    Par soazig dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 13/02/2004, 19h44
  5. [VB6] [Syntaxe] Fonction renvoyant un tableau d'objets
    Par Troopers dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 18/10/2002, 15h33

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