Pointeur,allocation et restitution memoire !!

Signaler
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013
-
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013
-
Salut !

Désolé pour le titre qui ne veut rien dire mais je savais pas trop quoi mettre;

Je travaille actuellement sur une librairie (id3lib)

ID3_Tag *myTag;

myTag->Link ( "mysong.mp3" );


mytag->fonction1;


delete myTag;


<tt><tt>
Je me retrouve avec une erreur fatale a l'execution du prog (compilation nickel)
Par contre :


</tt></tt><tt><tt><tt><tt>ID3_Tag myTag;
myTag.Link ( "mysong.mp3" );

mytag.fonction1;

</tt></tt></tt></tt>Marche sans problemes.

Donc je me pose quelques questions:



1 - Pourquoi ca plante dans le premier cas et pas le second

2 - A quoi sert le delete dans le premier cas (je croyais que c'etait necessaire uniquement quant on utlisait NEW)

3 - Ai je besoin d'un delete dans le second cas, si oui j arrive pas a trouver la syntaxe.

4 - A cause de ce probleme je me retrouve obligé de faire

<tt><tt><tt><tt><tt><tt><tt><tt>ID3_Tag myTag1;
ID3_Tag *myTag2;

Alors que je pourrais utliser le meme, y aurait il pas un moyen de gruger ???

</tt></tt></tt></tt></tt></tt></tt></tt>

6 réponses

Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
1) tu oublies le new
A partir de la les autres réponses sont inutiles:

ID3_Tag *myTag = new ID3_Tag(); // Dans le tas, ce n'est pas de la gruge
myTag->Link ( "mysong.mp3" );
mytag->fonction1;
delete myTag;

Ou encore:
ID3_Tag tag; // sur la pile, pas de delete
ID3_Tag *myTag = &tag;
myTag->Link ( "mysong.mp3" );
mytag->fonction1;

Mais ici, l'usage des pointeurs est inutile
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

Effectivement avec le new ca marche :)



Par contre du coup j'ai un nouveau probleme !

J'ai defini en global ID3_Frame * myFrame = new ID3_Frame(); en tete du fichier vu que je bosse tout le temps avec le meme.



Dans ma fonction je me retrouve avec

void ecriture(.....) {

myFrame = myTag.Find ( GetFrame(choix) );



// en fait le probleme est la : si myframe == NULL je suis obligé de
reappeller le constructeur pour une nouvelle variable ID3_Frame, je ne
peux pas travailler avec la meme ????



if (myFrame == NULL) {

ID3_Frame * myFrame2 = new ID3_Frame();

myFrame2->Clear();

myFrame2->SetID(GetFrame(choix));

myTag.AddFrame(myFrame2);

myFrame2 = myTag.Find ( GetFrame(choix) );

[......]

delete myFrame2[];

}

}



Ya pas un moyen pour rappeller le constructeur ?? Parceque ca me fait
peur d avoir a me creer une fonction pour "renouveler" la variable dans
la classe.



Par contre je commence a trouver mon code de plus en plus crado et si
c'est vraiment trop le bordel je me demande si il ne vaudrait pas mieux
la definir en local plutot que en global meme si je doit la repasser en
parametre a toutes mes fonctions !!!
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
>si myframe == NULL je suis obligé de reappeller le constructeur pour une nouvelle variable ID3_Frame

Pourquoi myFrame serait-il NULL à un moment donné, si tu utilises toujours le même? Et pourquoi tu utilise un pointeur?
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

Ben en fait myTag.Find (
GetFrame(choix) ) renvoi soit une frame (si elle existe) soit NULL mais
apparrement elle doit faire plus que ca vu quelle deviens inutilisable
juste apres !!

En fait si elle n'existe pas je la crée, enfin j essaye il me faudrait
la deleter et la refaire mais c'est moche comme c'est pas possible
surtout pour une variable globale.



Et j utilise
les pointeur car c'est cette technique qu'ils on utilisé dans l'
exemple de la doc de la lib (apres verifications c'est plutot rare en
effet) , y a une raison pour ne pas preferer les pointeurs dans
cet exemples ??
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

myFrame = myTag.Find ( GetFrame(choix) );



if (myFrame == NULL) {

myFrame->Clear();

myFrame->SetID(GetFrame(choix));

myTag.AddFrame(myFrame);

myFrame = myTag.Find ( GetFrame(choix) );

}



Vla le code voulu qui plante a clear() si frame == NULL.

En fait je peux modifier si la frame existe deja ( en changeant == NULL
en !NULL) mais si il me faut la creer frame NULL meme la commande
myFrame->Clear(); me plante tout "La memoire ne peut pas etre read"
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

C bon j'ai mit une variable locale plutot que globale et donc j'ai plus
de liberté mais par contre je sais pas si je doit mettre le new.



ID3_Frame *myFrame;



marche tres bien par contre si je fait



delete myFrame;



je me retrouve avec un message d'erreur a la fain de ma boucle main();



Il vaut mieux mettre new ou ne pas utliser delete (a certain endroit je
suis obligé d'utiliser new donc le delete y est obligatoirement
mais quand ca marche sans new je sais pas ) ???