2010-09-06 4 views
0

Il y a une fuite de mémoire dans mon programme et parce que je ne connais pas bien C (créé une fonction dans ma classe Objective-C pour charger des chaînes à partir d'une base de données SQLite). Quelqu'un peut-il repérer ma gaffe? Merci:Question de gestion de mémoire simple en Objective-C

static int MyCallback(void *context, int lCount, char **values, char **columns){ 

NSMutableArray *sqlRawStrings = (NSMutableArray *)context; 
for (int i = 0; i < lCount; i++) { 
    const char *nameCString = values[i]; 
    if (nameCString != NULL) { 
     [sqlRawStrings addObject:[NSString stringWithUTF8String:nameCString]]; 
    } 
} 

return SQLITE_OK; 

} 

Tout cela est appelé plus tôt ici:

int numberA = [loadBundleNumber intValue]; 
char str1[130] = "select "; 
for(int i = 7; i <7 + numberA; i++){ 
    str1[i] = 'a'; 
} 
char str2[20] = " from puzzles"; 
strcat(str1,str2); 

NSString *file = [[NSBundle mainBundle] pathForResource:@"finalPuzzles" ofType:@"db"]; 
sqlite3 *database = NULL; 
if (sqlite3_open([file UTF8String],&database) == SQLITE_OK) { 
    sqlite3_exec(database, str1, MyCallback, sqlRawStrings, NULL); 
} 
sqlite3_close(database); 

Merci

+3

C'est l'objectif C, qui est une chose différente de C. – Juliano

+2

Bien que je ne sois pas très versé, mais je peux sérieusement voir que vous ne détruisez pas les choses une fois utilisées. – Neutralizer

+0

avez-vous envisagé de créer un lien avec un outil de gestion de la mémoire qui va remplacer malloc/free, etc? Laissons l'outil faire le travail et il trouvera probablement des sous-titres obscruraux que même la révision de code pourrait manquer (en fait, même le lissage, avec Splint) pourrait signaler des problèmes de soem) – Mawg

Répondre

0

Plus de commentaires que les réponses que je ne vois pas comment vous fuite de mémoire juste encore (pas assez points à commenter pour le moment). Comment observez-vous qu'il y a une fuite de mémoire? Pouvez-vous voir ce qu'il y a à l'intérieur de l'objet qui fait l'objet d'une fuite et revenir sur sa trace de pile d'allocation pour voir de quoi il s'agit?

Vous pouvez également fournir la déclaration pour sqlRawStrings? En passant, je pense que la façon dont vous construisez vos cordes pourrait être améliorée. Envisagez d'utiliser sprintf. Vous pouvez également envisager d'utiliser un fichier .mm au lieu de .m et vous obtiendrez des fonctionnalités C++; la classe std :: string pourrait vous aider. Enfin, ne fermez pas quelque chose à moins que vous ne l'ayez ouvert avec succès, c'est-à-dire que le "sqlite3_close" devrait se trouver dans le même bloc que sqlite3_exec.

J'espère que cela vous sera utile.

+0

Merci pour votre commentaire Chris. sqlRawStrings est une variable d'instance qui est déclarée lors du chargement du programme: sqlRawStrings = [[NSMutableArray alloc] init]; J'ai appris des fuites de mémoire via l'outil Instruments d'Apple. –

+0

Avez-vous essayé d'éliminer le rappel d'appel pour voir si la fuite de mémoire disparaît, c'est-à-dire avez-vous isolé la fuite? (essayez de passer NULL comme callback à la fonction exec) –

+0

Aussi je suppose que votre code s'exécute dans un runloop? Si ce n'est pas le cas, votre stringWithUTF8String et d'autres méthodes fuiront car leur autorelease ne sera jamais réalisée. –

0

La meilleure supposition est que sqlRawStrings n'est jamais libéré et ainsi rien n'est ajouté à cela.