2010-10-05 4 views
0

Si je vais faire cette opération un peu de fois:Quand se fier à la collecte des ordures et quand pas?

res = mysql_perform_query(conn, "show tables"); 

    printf("MySQL Tables in mysql database:\n"); 
    while ((row = mysql_fetch_row(res)) !=NULL) 
     printf("%s\n", row[0]); 

Dois-je courir mysql_free_result(res); à la fin de chaque opération ou se fonder sur le mécanisme de collecte des ordures, pourquoi?

MISE À JOUR

Je ne vois toujours pas clairement comment juger si une structure de données doit nettoyer selon réponse existante.

+5

Vous devez exécuter la fonction de nettoyage. C++ ne fait pas de garbage collection. – sje397

+0

Est-ce que 'c' fait alors gc? – ollydbg

+1

Non, ce n'est pas le cas. – sje397

Répondre

2

En C++, jamais. C++ n'est pas collecté par les ordures. Le plus proche serait RAII, qui consiste essentiellement à emballer des éléments nécessitant un nettoyage dans les objets qui effectuent le nettoyage dans leur destructeur. Je ne peux pas donner plus de détails car je n'utilise pas vraiment beaucoup de C++. En aparté: Même dans un langage GC'd, GC ne fonctionne que très bien pour la mémoire. Le nettoyage explicite est toujours nécessaire pour des choses comme les connexions SQL, les handles de fichiers, etc.

Conclusion: Vous devez toujours nettoyer une fois que vous avez terminé. (Sauf si la documentation indique que ce n'est pas nécessaire)

+0

Pourquoi n'ai-je pas besoin de nettoyer 'row' à chaque fois? – ollydbg

+0

Désolé, mauvais phrasé de ma part. J'ai répondu au titre, pas au corps de la question. Je voulais dire "ne comptez jamais sur GC parce que ce n'est pas là". Nettoyez chaque fois ou mettez en cache et réutilisez la ligne (le cas échéant). – Kyte

+0

@ollydbg - Vous devez nettoyer la ligne à chaque fois, mais cela dépend de votre implémentation, de la portée dans laquelle vous déclarez la ligne et si vous la réutilisez ou non. –

Questions connexes