int *p=(int * )malloc(sizeof(int));
delete p;
Lorsque nous allouons de la mémoire à l'aide de malloc, nous devons la libérer à l'aide de free et lorsque nous allouons à l'aide de new en C++, nous devons la libérer à l'aide de delete.
Mais si nous allouons de la mémoire à l'aide de malloc, puis utilisons delete, il devrait y avoir une erreur. Mais dans le code ci-dessus, aucune erreur ni avertissement ne vient en C++.
De plus, si nous inversons et allouons en utilisant new et libérons en utilisant free, il n'y a pas non plus d'erreur ou d'avertissement.
Pourquoi en est-il ainsi?
Il s'agit d'un comportement non défini, car il n'y a aucun moyen de prouver de manière fiable que la mémoire derrière le pointeur a été allouée correctement (c'est-à-dire par new
pour delete
ou new[]
pour delete[]
). C'est votre travail de vous assurer que de telles choses ne se produisent pas. C'est simple lorsque vous utilisez les bons outils, à savoir les pointeurs intelligents. Chaque fois que vous dites delete
, vous vous trompez.
alors il devrait y avoir une erreur
Il y a. Ce n'est tout simplement pas nécessairement apparent.
Le standard C++ (et le standard C, sur lequel le standard C++ est modélisé) appellent ce type d'erreur comportement indéfini . Par non défini , cela signifie que tout peut arriver. Le programme peut continuer normalement, il peut se bloquer immédiatement, il peut produire un message d'erreur bien défini et se terminer avec élégance, il peut commencer à afficher des erreurs aléatoires à un certain moment après l'événement de comportement indéfini réel, ou invoquer des démons nasaux =.
Il est de votre responsabilité de faire attention et d'éliminer ces erreurs. Rien n'est garanti pour vous alerter quand ils se produisent.
Utilisez free()
pas delete
.
si vous malloc
vous devez alors appeler free
pour libérer de la mémoire.
si vous new
vous devez appeler delete
pour libérer de la mémoire.
Ici est un lien qui l'explique.