Dans mon code, j'ai surchargé les opérateurs new
et delete
pour obtenir le nom de fichier et le numéro de ligne. Dans mon code j'utilise map
et stack
. Quand je fais effacer une valeur particulière de la carte, il suffit d'appeler ma fonction delete
surchargée mais je ne veux que delete
explicites déclarations pour pouvoir accéder à ma fonction, pas d'autres. Comment puis je faire ça?Surcharger Supprimer opérateur en C++
Répondre
map
et stack
sont appelant explicitement delete yourObject
sous le capot, pour la plupart des définitions de « explicite » — c'est pourquoi votre opérateur de suppression est appelé se. Ces suppressions ne sont pas moins légitimes que celles de votre code.
Comment obtenez-vous le nom du fichier et le numéro de ligne, par le chemin? Méfiez-vous que __FILE__
et __LINE__
ne fonctionnera probablement pas. Ceux-ci retourne le nom du fichier et le numéro de ligne du numéro de la ligne qu'ils trouvent sur, ce qui signifie que vous obtiendrez l'emplacement de votre méthode delete
, pas l'emplacement de l'appelant .
Pour obtenir le comportement que vous voulez, à la fois la connexion ne supprime « explicites » et le suivi de leur emplacement, vous devrez remplacer les suppressions que vous souhaitez ouvrir une session avec des appels macro. Dans ce cas, vous n'avez pas besoin de remplacer delete
. Par exemple:
#define DELETE(p) \
do { \
std::cout << __FILE__ << ":" << __LINE__ << ": " << p << std::endl; \
delete p; \
}
Pourquoi "__FILE__' et" __LINE__' ne fonctionneront-ils pas? –
Parce qu'il sera toujours appelé à partir du fichier où vous surchargez l'opérateur de suppression. Voir ma réponse pour un moyen de surmonter cela. –
oui je sais mais j'ai un autre moyen d'obtenir le nom de fichier et la ligne. Le problème n'est pas d'obtenir le nom de fichier, mais c'est sur la façon d'arrêter d'appeler la fonction de suppression. Mon moyen avec explicite n'était pas un type spécifique. par exemple: char * ptr = new char [40]; supprimer ptr --- devrait appeler ma fonction de suppression, mais supposons que j'ai une carte. si j'écris map.erase() il ne devrait pas appeler ma fonction de suppression. –
Si vous ne voulez que votre propre supprimer pour appeler votre surcharge, je ne pas surcharger l'opérateur de suppression, mais plutôt faire une méthode personnalisée comme DeleteMyObject qui remettrait l'original supprimer puis créer une macro pour appeler cette fonction et remplacez toutes vos suppressions avec cette macro.
Comme
#define DELETE_MY_OBJECT(obj) DeleteMyObject(obj, __FILE__, __LINE__)
et la méthode pourrait ressembler à
void DeleteMyObject(void* obj, char* file, char* line)
{
// Log delete
...
delete obj;
}
puis dans votre code
MyObj* obj = ...
...
DELETE_MY_OBJECT(obj);
J'ai déjà un code et ne peux pas changer dans le code, je peux juste ajouter des macros et invoquer la fonction. C'est pourquoi je devais faire ça. –
question intéressante. Je pense que vous devrez peut-être réviser votre question avec plus de détails afin que les gens puissent comprendre votre situation. Par exemple, expliquez pourquoi vous voulez surcharger l'opérateur de suppression (debug? Logging?) Et comment vous obtenez le nom de fichier et les numéros de ligne. Pourquoi ne pouvez-vous pas modifier le code pour utiliser les macros de suppression proposées dans les réponses ci-dessous? Etc. Avoir plus d'expérience aide les personnes les plus expérimentées à répondre à votre question. –