web-dev-qa-db-fra.com

Comportement de malloc avec suppression en C ++

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?

27
Luv

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.

30
Cat Plus Plus

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.

9
n.m.

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.

2
andre