Les différences entre libre dans C et delete en C++?
Je sais que le libre fonctionnement dans C est-à-dire au compilateur ce bloc de mémoire est gratuit pour le compilateur à utiliser pour plus d'allocation, mais la mémoire n'est pas libérée.
Ce sujet de la supprimer en C++? la même que libre?
Oui, c'est la même chose. Mais vous pouvez surcharge de new/delete implémentations et faire votre propre chose stackoverflow.com/q/4261963/176769
supprimer va appeler le destructeur, libre de ne pas le faire, et c'est un assez énorme différence
Vous ne dites pas le compilateur, vous dire le moment de l'exécution. Et la mémoire peut ou ne peut pas être retourné pour le système d'exploitation en fonction de la mise en œuvre des conditions particulières. Habituellement, les petits blocs sont obtenus à partir de croissant de segments de mémoire (donc réutilisé mais n'est pas retourné), tandis que grand-blocs sont obtenus à partir du système en tant qu'entités distinctes (à l'aide de mmap ou similaire) et retourné au système une fois libéré.
supprimer va appeler le destructeur, libre de ne pas le faire, et c'est un assez énorme différence
Vous ne dites pas le compilateur, vous dire le moment de l'exécution. Et la mémoire peut ou ne peut pas être retourné pour le système d'exploitation en fonction de la mise en œuvre des conditions particulières. Habituellement, les petits blocs sont obtenus à partir de croissant de segments de mémoire (donc réutilisé mais n'est pas retourné), tandis que grand-blocs sont obtenus à partir du système en tant qu'entités distinctes (à l'aide de mmap ou similaire) et retourné au système une fois libéré.
OriginalL'auteur | 2011-07-25
Vous devez vous connecter pour publier un commentaire.
Il y a deux notions de
delete
en C++: l'Un est la opérateur, a déclaré que::operator delete(void*)
, qui, fondamentalement, seulement libère de la mémoire et n'est pas généralement considéré par la plupart des programmeurs. L'autre est le supprimer l'expression,delete p;
, oùp
est unT*
. L'expression appelle le destructeur de l'objet pointé parp
(et puis libère la mémoire), qui est d'une importance cruciale pour le langage C++, qui n'a pas d'analogue dans C.En règle générale, vous paire
new
expressions avecdelete
expressions, etmalloc()
appels de fonction avecfree()
appels de fonction:Partie avancée (pas en réponse à la discussion de la question)
Dynamique de durée de vie des objets en C++ suit cette tendance générale: l'allocation d', construire, détruire, désallouer. La norme
new
expression effectue la répartition et à la construction, alors que la normedelete
expression effectue la destruction et la désallocation.Vous pouvez écrire le processus manuellement:
En fait, si vous avez vraiment envie de mettre en œuvre Bébé C++, vous pouvez définir la opérateurs comme
malloc
/free
:Le réel C++ magie se produit en vertu de la
new
etdelete
expressions: La normenew
expression appelle le constructeur (unnew
expression est la seulement façon d'appeler un constructeur de C++!) après répartition, alors que la norme de supprimer l'expression appelle le destructeur avant de libération de la mémoire.Pourquoi "formule standard"? Eh bien, vous pouvez également définir et de surcharge de nombreuses autres versions de
new
etdelete
opérateurs. Cependant, il y a une importante asymétrie: même si vous pouvez utiliser un customnew
opérateur personnalisé dans unnew
expression (généralement surnommé "le placement de nouveaux"), il n'y a pas d'équivalent "placement-supprimer" de l'expression. Donc, chaque fois que vous utilisez un personnalisénew
expression, vous devez appeler manuellement le destructeur avant l'appel de la correspondance personnalisée supprimer opérateur:Noter qu'il n'existe pas une coutume de supprimer l'expression
delete (A,B,C) p'
!Pour être complet, le placement standard de nouveaux de l'opérateur, dont le but est d'appeler un constructeur, est commandée par la norme sous la forme suivante:
Il est correspondant
delete
opérateur est également chargé, le nom de ne rien faire:Vous pouvez le voir dans l'exemple ci-dessus pourquoi cela est nécessaire.
Il est important de toujours surcharge des versions personnalisées de
new
etdelete
en paires! La raison en est que si la construction de l'objet échoue avec une exception dans le constructeur, puis la mémoire est libérée par un appel à ladelete
opérateur qui correspond à la délinquancenew
expression.Deuxième mise à jour: être d'exception-safe, nous devons considérer que le constructeur de
T
pourrait jeter:Version 1:
Version 2:
delete
ne pas appeler le destructeur; mais le compilateur met l'appel au destructeur avant de où il trouvedelete
de l'opérateur. Au moment où vous entrez dans le bloc de fonction dedelete
, le destructeur est déjà appelé.Votre formulation est un peu imprécise: Si vous dites
::operator delete(p);
, le destructeur ne sera pas appelée. Le destructeur d'appel est une conséquence de la suppression de la expression.La "première" séquence d'appel pourrait être écrit manuellement comme ceci:
T * p = (T*)::operator new(sizeof(T)); p = new (p) T; p->~T(); ::operator delete(p);
youd être fou pour écrire 🙂Pourquoi ne pas ajouter des commentaires dans le texte de la question? Il serait approprié lorsque vous étendez votre propre réponse. Comme pour l'explicite de la séquence, il est important lors de la définition de certaines structures de données ou d'allocateurs (comme dans la coutume de l'allocateur pour les conteneurs STL). Des choses comme
std::vector
allouer un bloc de mémoire, mais l'initialiser plus tard. Ce n'est pas quelque chose qu'on doit le faire régulièrement, mais quand vous êtes après de la performance, vous éventuellement besoin.Je sais que vous ne l'utilisation explicite de l'allocation et de la construction sous le capot. J'ai juste pensé que ce serait en dehors de la portée de l'OP. C'est aussi pourquoi je ne voulais pas ajouter les spécificités de
operator new
de remplacement et allocateurs à cette question. Si vous voulez, bien que, je pourrais le faire.OriginalL'auteur Kerrek SB
delete
est le même (ish)free
, mais a des différences importantes. La différence la plus notable est quedelete
va lancer un objets destructeur alors quefree
ne sera pas.Comme les commentaires le soulignent, un autre détail très important n'est pas de mélange de malloc/free et new/delete. Si vous allouez avec malloc, utilisation libre et, de même, si vous utilisez les nouvelles, utilisation de supprimer!
new
et tenter de les libérer avecfree()
ou l'allocation de avecmalloc()
et tenter de les libérer avecdelete
. Certaines implémentations plante si vous essayez de faire cela!Bon point, mis à jour à la question de la description.
Cela fonctionne de cette façon,
new
=>(malloc
)=>constructor
;delete
=>destructor
=>(free
) ? Où (malloc
,free
) sont appel "interne/automatiquement" . Suis-je droit?OriginalL'auteur Jeff Foster
Ils ne sont pas les mêmes. Le
delete
opérateur en C++ appelle le destructeur de l'objet, qui, en fonction de la mise en œuvre, devrait libérer de la mémoire. Ledelete
fonction peut également être surchargé, oùfree
ne peut pas.ok, mais comment libérer de la mémoire dans le destructeur?
Hudec: Très vrai. Édité. Merci.
Simplement en appelant
delete
va appeler le destructeur par défaut pour cet objet, en libérant de la mémoire.Formellement mal. Il va appeler le destructeur de et libérer de la mémoire. Ils sont deux étapes distinctes et, plus tard, peut être substituée par type de définir la
operator delete()
méthode (et correspondantoperator new()
).OriginalL'auteur Evan Mulawski
malloc() et free() ne doivent pas être utilisés dans le code C++ parce qu'ils ne supportent pas l'objet de la sémantique. En outre, les résultats de l'appel à free() pour libérer un objet qui a été alloué par de nouvelles, ou de l'utilisation de la supprimer pour libérer de la mémoire qui a été allouée par malloc(), ne sont pas définis. La norme C++ ne garantit pas que le sous-jacent de la mise en œuvre du nouvel opérateur utilise malloc(); en fait, sur certaines implémentations de la fonction malloc() et la nouvelle utilisation de différents segments.
Cochez cette lien
delete() supprime la totalité de l'espace mémoire occupé rendant impossible de renvoyer la varaiable une fois son est supprimé lorsque, dans free() u peut toujours y avoir accès.
OriginalL'auteur nebula