IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)



Quelle est la différence entre delete et delete[] ?
auteur : Geronimo
Si jamais vous avez alloué un tableau de pointeurs avec new[] , utilisez alors delete[] pour libérer la mémoire utilisée par ce tableau. L'utilisation du simple delete ne libérerait pas la mémoire correctement. Dans cet exemple, nous supposons que nous disposons d'une classe TEtoile. On cherche a créer un tableau de X étoiles.
class TForm1 : public TForm
{
    //...
    public:
    TEtoile **Etoiles;
    void ConstruitEtoiles(const int nbetoiles);
    void LibereEtoiles();
    //...
};

// Fonction à appeler pour construire nbetoiles TEtoile
void ConstruitEtoiles(const int nbetoiles)
{
    Etoiles=new Etoile*[nbetoiles];
    for (int i=0; inbetoiles; i++)
        Etoiles[i]=new Etoile;
}

// Fonction à appeler pour supprimer toutes les étoiles
void LibereEtoiles()
{
    for (int i=0; i<nbetoiles; i++)
        delete Etoiles[i];
    delete[] Etoiles;
}
Cet exemple permet de créer un tableau de nbetoiles pointeurs sur des TEtoile. L'instruction Etoiles = new Etoile*[nbetoiles]; permet de construire le tableau de pointeurs. Il faut ensuite allouer la mémoire nécessaire à chaque TEtoile, ce que fait la boucle for. La fonction LibereEtoiles fait la démarche inverse : elle libère tous les TEtoile et ensuite, libère la mémoire utilisée par le tableau à l'aide de delete[] .

Pourquoi la syntaxe TYPE ptr** = new TYPE*[taille*sizeof(TYPE)] est-elle erronée ?
L'opérateur new du C++ est beaucoup plus performant que la fonction malloc du C. Lorsque vous utilisez cette syntaxe :
TYPE ptr** = new TYPE*[taille*sizeof(TYPE)]; // >-- FAUX
Par exemple,
// Pour constuire dynamiquement un tableau de 100 entiers
int ptr** = new int*[100*sizeof(int)]; // >-- FAUX
vous construisez non pas un tableau de 100 "lignes", mais une tableau de 100 lignes multipliées par la taille d'un entier. En fait, l'opérateur new connait la taille des éléments du tableau grâce au type du constructeur :
TYPE ptr** = new TYPE*[taille]; // >-- CORRECT
Ici, c'est le second TYPE qui détermine la taille des éléments du tableau. La taille détermine le nombre d'éléments du tableau.

Bien sûr, n'oubliez pas de faire delete.