85 votes

C++ appelle delete sur une variable allouée sur la pile

En ignorant le style de programmation et la conception, est-il "sûr" d'appeler delete sur une variable allouée sur la pile ? Par exemple

   int nAmount;
   delete &nAmount;

ou

class sample
{
public:
    sample();
    ~sample() { delete &nAmount;}
    int nAmount;
}

142voto

Mr Fooz Points 21092

Non il n'est pas sûr d'appeler delete sur une variable allouée à la pile. Vous ne devez appeler delete sur les choses créées par new .

  • pour chaque malloc ou calloc il devrait y avoir exactement un free .
  • Pour chaque new il devrait y avoir exactement un delete .
  • Pour chaque new[] il devrait y avoir exactement un delete[] .
  • Pour chaque allocation de pile, il ne doit pas y avoir de libération ou de suppression explicite (le destructeur est appelé automatiquement, le cas échéant).

En général, vous ne pouvez pas combiner ces éléments (par exemple, pas de free -ing ou delete[] -d'un new objet). Cela entraîne un comportement non défini.

64voto

Jeremy Ruten Points 59989

Eh bien, essayons :

jeremy@jeremy-desktop:~$ echo 'main() { int a; delete &a; }' > test.cpp
jeremy@jeremy-desktop:~$ g++ -o test test.cpp
jeremy@jeremy-desktop:~$ ./test
Segmentation fault

Donc, apparemment, ce n'est pas sûr du tout.

18voto

Ferruccio Points 51508

Gardez à l'esprit que lorsque vous allouez un bloc de mémoire à l'aide de new (ou de malloc d'ailleurs), le bloc de mémoire réellement alloué sera plus grand que ce que vous avez demandé. Le bloc de mémoire contiendra également des informations comptables afin que, lorsque vous libérez le bloc, il puisse facilement être remis dans le pool libre et éventuellement être fusionné avec des blocs libres adjacents.

Lorsque vous essayez de libérer de la mémoire que vous n'avez pas reçue du nouveau, ces informations comptables ne seront pas présentes mais le système agira comme si elles l'étaient et les résultats seront imprévisibles (généralement mauvais).

8voto

Sambatyon Points 1236

Après avoir joué un peu avec g++ 4.4 sous Windows, j'ai obtenu des résultats très intéressants :

  1. appeler delete sur une variable de pile ne semble rien faire. Aucune erreur ne se produit, mais je peux accéder à la variable sans problème après la suppression.

  2. Avoir une classe avec une méthode avec delete this supprime avec succès l'objet s'il est alloué dans le tas, mais pas s'il est alloué dans la pile (s'il est dans la pile, rien ne se passe).

4voto

Vinay Points 3310

Non, La mémoire allouée en utilisant new doit être supprimée en utilisant l'opérateur delete et celle allouée en utilisant malloc doit être supprimée en utilisant free. Et il n'est pas nécessaire de désallouer les variables qui sont allouées sur la pile.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X