Pointeur,allocation et restitution memoire !!

SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013 - 17 juil. 2005 à 18:07
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013 - 24 juil. 2005 à 13:08
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

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 13
17 juil. 2005 à 18:18
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
0
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
17 juil. 2005 à 19:42
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 !!!
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 13
17 juil. 2005 à 20:04
>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?
0
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
17 juil. 2005 à 21:03
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 ??
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
17 juil. 2005 à 21:32
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"
0
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
24 juil. 2005 à 13:08
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 ) ???
0
Rejoignez-nous