ObjectAlloc
ancrou
Membre
Bonjour,
j'ai une fuite mémoire !
J'ai surchargé retain et release dans ma classe ObjetW et mis breakpointer pour compter combien de fois je passe.
Je passe:
24 fois dans retain
24 fois dans release
et il me reste 12 ObjetW non libérer, vu par ObjectAlloc
Voyez vous où j'ai oublié de libérer ?
Merci
j'ai une fuite mémoire !
J'ai surchargé retain et release dans ma classe ObjetW et mis breakpointer pour compter combien de fois je passe.
Je passe:
24 fois dans retain
24 fois dans release
et il me reste 12 ObjetW non libérer, vu par ObjectAlloc
<br />-(id)initWithX{<br /> if(self = [self init]){<br /> tab = [[NSMutableArray alloc] init ]; // un tableau de ObjectW<br /> }<br /> return self;<br />}<br />-(void) dealloc{ <br /> [tab release];<br /> [super dealloc];<br />}<br /><br />-(BOOL) doW{<br /> std::vector<WaveHemodynamic> wa;<br /> wa = glue->do();<br /> unsigned short sizeVec = wa.size();<br /> ObjectW* wave;<br /> for(unsigned short ii=0; ii<sizeVec;ii++){<br /> wave = [[ObjectW alloc] initWith];<br /><br /> [tab addObject:wave];<br /> [wave release];<br /> }<br /> wa.~vector();<br /> return YES;<br />}<br />
<br />[f doW];<br />NSMutableArray* donnee = [[[NSMutableArray alloc] initWithArray:[f tab]]retain];<br /><br />ObjectW* wave;<br /> <br />for(ii=0;ii<nombreii;ii++){ <br />wave = [[donnee objectAtIndex:ii]retain];<br />}<br />[donnee release];<br />[wave release];<br />
Voyez vous où j'ai oublié de libérer ?
Merci
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Alors les trucs qui me choquent dans ton code :
1) L'appel explicite au destructeur de ~vector() : c'est pas à faire ça, et de toute façon pas nécessaire car la variable wa étant locale à la fonction doW, elle sera détruite dès qu'elle sortira du scope où elle est déclarée, ici la fonction doW.
2) c'est quoi cette méthode "initWith" de ta classe ObjectW ? C'est pas un nommage conventionnel ! soit c'est "init" tout court, soit c'est "initWithQQch:" avec un paramètre à la suite...
3) Ton NSMutableArray tu le crées avec alloc+initWithArrai+retain... le retain n'a rien à faire là , un objet créé par alloc+init[...] est déjà retenu une fois.
Si tu relis la règle de base expliquée sur l'ADC, Donc si tu fais un alloc, tu dois faire un release pour le balancer quand tu n'as plus besoin de l'objet. Si tu fais un retain, tu dois faire aussi un release pour balancer le retain.
Donc si tu fais alloc+init+retain (ce qui est inutile), tu devrais donc faire deux release, un pour alloc un pour retain...
Là tu n'as même pas besoin du retain après alloc/init, ton objet vient d'être créé il a déjà un retainCount de 1 !
4) Pas besoin, au cas où c'était ce que tu voulais faire et que c'était une faute de frappe, d'envoyer un retain à [f tab] (du moins si tu as bien codé l'accesseur de ta variable "tab"). Tu n'as à t'occuper que des objets que tu crées (comme indiqué dans la même note de l'ADC). De ce côté sinon c'est le NSMutableArray qui s'occupe des objets que tu lui passes et qu'il gère ensuite de son côté.
5) Tu envoies nombreii[/ii] retain à tes objets (et je ne comprends d'ailleurs pas pourquoi, vu qu'ils sont déjà retenus par le tableau "donnee" lui-même, aucun intérêt de leur envoyer un retain ici) alors que tu n'envoies qu'un seul "release", au dernier objet wave vers lequel tu pointes à la fin de ta boucle. Donc il y a un déséquilibre de ce côté aussi.
fait un double retain sur donnee
On peut sans doute le remplacer par :
NSMutableArray* donnee = [NSMutableArray arrayWithArray:[f tab]];
sans faire le [donnee release] final.
initWith car j'ai masqué des trucs :S
le destructeur de vector, j'étais désespéré
Mais toujours le même problème
Dans ton premier post, wave = [[donnee objectAtIndex:ii]retain] provoque une fuite mémoire.
Dans ton deuxième post, il manque [donnee release]
+
Chacha
J'ai enlevé le retain
Si je mets un [donnee release] apres le for, ça plante >:(
Donc je le mets et j'enlève le [tab release] dans la méthode -(void) dealloc{
Mais toujours le même problème 12 ObjetW non libérés, vu par ObjectAlloc
Il semble que tu veuilles balayer les objets de nom générique wave qui se trouve dans le NSArray tab.
Voilà comment je ferais :
[f doW];
for(ObjectW* wave in [f tab]) {
  // do anything with wave, without any retain or release
}
et c'est tout
NSMutableArray * donnee=[f tab];
ObjectW* wave;
NSInteger ii;
for(ii=0;ii<nombreii;ii++){
 wave = [donnee objectAtIndex:ii];
 // do ...
}
et là , cela ne doit pas planter, on ne fait que renommer le pointeur sur tab .
ça ne compile pas :
error: nested functions are disabled, use -fnested-functions to re-enable
error: syntax error before 'in'
???
Pour Objective-C 1.0, il faut utiliser NSEnumerator
Oui, je l'avais corrigé de moi même :P
oui, je comprends mieux ::)
ça compile, marche ... mais toujours mes 12 ObjectW non libérés
j'ai enlevé le [donnee release] avec cette méthode
Je ne peux pas faire un release sur tab dans le -(void) dealloc{
Alors que dans le init j'ai fait un alloc et init de tab :-\\
Bien sur
Il n'y a aucune raison qu'ils soient libérés tant que f n'est pas désalloué. Pour que les objets répertoriés dans tab disparaissent, il faut que quelque part il y ait un [f release] : la durée de vie de tab, et des objets est ici identique à celle de f.
J'avais un autorelease sur f avec le alloc et init
Je l'ai enlevé et mis un release à la fin de l'utilisation de f.
Mais toujours pareil.
Donc reprenons:
Dans la classe Inter; méthode doW
la ligne [tab addObject:wave]; fait appel à un retain; 12 fois (normal).
la ligne qui suit [wave release]; fait appel à release; 12 fois.
Au final, il en reste 12, certainement le init => wave = [[ObjectW alloc] initWithAll:deTypeNSString:deTypeUnsignedInt];
Dans le init de la classe inter j'ai : tab = [[NSMutableArray alloc] init ];
Mais dans le -(void) dealloc{, je ne peut pas faire de [tab release];sinon crash
cela peut venir de deux raisons :
• soit tab a déjà été desalloué // [tab retainCount]=0
• soit l'un au moins des objets wave a été désalloué, et lors du [tab release] un mesage release lui est envoyé.
I think so mais je ne vois pas où :S
Quand je fais au débug:
init de Wave
Retain de wave
release de wave
cela 12 fois.
Apres au release de la l'objet Inter, il fait appel à son dealloc
et donc au [tab release];
le [tab release]; appel 12 fois le release de Wave et au 12ème crash !
J'ai trop le démon de me faire chier sur ce truc de merde !
for(ii=0;ii<nombreii;ii++){
wave = [[donnee objectAtIndex:ii]retain];
}
[donnee release];
[wave release];
Ton [wave release] final, tu l'as toujours ?
Parce qu'il n'a rien à faire ici
plus de wave relase, plus de donne release
Je disais cela parce qu'il est un peu curieux que ce soit le dernier release qui crashe.
Soit ton dernier wave a été traité différemment, soit le nombre d'éléments de tab n'est pas à jour
Finalement ça crash bien après mon code. Pourquoi, j'en sais rien.
Bad access !
Soit la fuite de mémoire soit le crash ::)
Si ton code est pas trop long, envoies-le par courrier ou ici, je veux bien regarder.
Je fais ni retain, ni release sur mon NSArrey, donc je ne fausse pas mon retaincount avec ce point