begin process at 2012 05 29 13:42:30
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Divers

 > 

pointeur,allocation et restitution memoire !!


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

pointeur,allocation et restitution memoire !!

dimanche 17 juillet 2005 à 18:07:06 | pointeur,allocation et restitution memoire !!

SnOOpss

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;

Je me retrouve avec une erreur fatale a l'execution du prog (compilation nickel)
Par contre :
ID3_Tag myTag;
myTag.Link ( "mysong.mp3" );

mytag.fonction1;

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
ID3_Tag myTag1;
ID3_Tag *myTag2;

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


dimanche 17 juillet 2005 à 18:18:30 | Re : pointeur,allocation et restitution memoire !!

vecchio56

Administrateur CodeS-SourceS
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
dimanche 17 juillet 2005 à 19:42:54 | Re : pointeur,allocation et restitution memoire !!

SnOOpss

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


dimanche 17 juillet 2005 à 20:04:09 | Re : pointeur,allocation et restitution memoire !!

vecchio56

Administrateur CodeS-SourceS
>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?
dimanche 17 juillet 2005 à 21:03:38 | Re : pointeur,allocation et restitution memoire !!

SnOOpss

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 ??
dimanche 17 juillet 2005 à 21:32:19 | Re : pointeur,allocation et restitution memoire !!

SnOOpss

    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"
dimanche 24 juillet 2005 à 13:08:11 | Re : pointeur,allocation et restitution memoire !!

SnOOpss

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 ) ???



Cette discussion est classée dans : tag, delete, cas, id3, mytag


Répondre à ce message

Sujets en rapport avec ce message

id3 tag [ par misteru ] Bonjour à toutes et à tous ;) voila j'aimerais me faire mon propre programme de renommer de tag en delphi mais je ne sais pas comment récuperer les i ID3 Tag v2 : Recherche documentation [ par arc59 ] J'ai réalisé un programme en C permettant de récupérer et modifier les id3 tag d'un fichier mp3 en v1 et 1.1. Je cherche maintenant à le faire pour le pointeur non initialisé [ par arc59 ] J'ai créé un programme qui permet de lire les tag des fichiers MP3. Ce programme utilise une structure de pointeurs vers des char. Les tag d'un fichie Supprimer les n premiers octet d'un fichier [ par arc59 ] Bonjour, dans mon programme de modification des ID 3 tag, je voudrai permettre à l'utilisateur de supprimer les Id3tag de version 2. Ces tag sont plac New et Delete [ par Tyroflan ] juste une questionsi j'ai ceci : int *p1;...main(){int pipi;cin >> pipi;p1 = new int [pipi];...delete[pipi] p1; ou bien delete[] p1;}MAISje procède randomize sous VC++ 6.0 non defini?? comment faire?? [ par petitivnnie ] En effet je n'ai troué aucune occurence des les headers fournis dans la version 6.0 de visual C++J'aimerai que l'on m'indique comment implenter cette net use * /delete EN C++ [ par LeBobo ] Salut. J'ai un petit programme qui utilise la fonction : system(''net use * /delete'') ; Le problème est que mon programme à une interface graphique w XML en C++ [ par The_Legacy ] Bonjour tout le monde,Je fais appel à votre aide car je suis dans un cas désespéré. Je ne suis pas un pro du C++, disons que je m'en sors, mais je doi Cas des tres grds nombres en C [ par unclecrufek ] slt a tousJ'ai un projet de math a realiser en C:convertir des nombres d'une base a une autre.Ce n'est pas bien complique, sauf qu'il faut que j'envis ImpressionJob (delete, pause...) [ par sena ] Bonjour,je recherche tout exemple ou toute personne pouvant m'aider à utiliser SetJob(....) car je n'y arrive pas.Je récupère bien tous les jobs mais


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,577 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales