2017-10-09 13 views
0

J'écris une fonction qui libère un tableau de pointeurs, mais lorsque j'appelle la fonction, j'obtiens l'erreur d'exécution 'double free ou corruption (fasttop)'. Le but de la fonction est d'effacer le tableau, qui obtient ses données d'un fichier d'entrée, si le fichier est déjà ouvert et la fonction fillArray est appelée à nouveau.Double gratuit ou corruption lors de l'effacement de la mémoire en C++

Voici la fonction qui est à l'origine des problèmes:

void freeArray(Country ** g_countryArray) 
{ 
    for (int i = 0; i < g_arrsz; ++i) 
    { 
     delete [] g_countryArray; 
    } 
} 

Si on l'appelle partout dans le programme, pour autant que je peux dire, il provoque un plantage du programme. J'ai lancé le débogueur mais je n'ai pas assez d'expérience pour comprendre la sortie. Je peux poster des informations à partir de ça si ça peut aider.

+1

Pourquoi supprimez-vous plusieurs fois le même pointeur? Cela n'a aucun sens. Un seul suffit; la deuxième fois présente un comportement indéfini. –

+0

Votre problème est 'g_arrsz' est'> 1'. Cela, et votre fonction fait certainement la mauvaise chose, car il supprime un tableau de pointeurs et non ce que les pointeurs pointent vers. En fait, votre problème semble être que vous ne connaissez pas C++ ou C et que vous utilisez des pointeurs sur des pointeurs. Non attends! Votre problème immédiat est le manque de [mcve]. Fondamentalement, vous avez 99 problèmes, et cette question ne va pas les résoudre tous. – Yakk

+0

Merci pour la direction d'élaborer une meilleure réponse. Oui, j'apprends le C++, donc NON je ne suis pas un expert. Pourquoi impliquez-vous que les pointeurs vers les pointeurs ne sont pas bons? Ceci est pour une affectation de classe, et l'utilisation d'un pointeur sur un pointeur fait partie de l'exigence ... –

Répondre

0

Vous avez omis le [i] dans votre corps de boucle. Vous devez supprimer le [] si les pointeurs individuels sont des objets uniques Country.

Vous pouvez également vouloir delete[] le tableau global; Cela dépend du reste de votre code.

+0

Pouah, merci. Stupide chose à manquer. –

+0

Il y a un tableau d'objets Country, ce que j'ai besoin de supprimer, donc je crois que j'accomplis cela maintenant. –

+0

@SethTaylor: Votre type de données ne correspond pas à un tableau d'objets 'Country', qui serait identifié par un' Country * 'à un seul niveau. –

0

Remplacez delete [] g_countryArray; par delete g_countryArray[i];.

delete [] arr supprime tout le tableau à la fois.

+0

OK, les deux instructions 'delete [] g_countryArray' et 'delete g_countryArray [i]' sont-elles interchangeables dans ce contexte? –

+0

Non. Non interchangeable. Première: {supprimer tous les éléments du tableau}; Deuxième: {delete ith element}. Pour le second, vous devez boucler chaque élément. –