2009-01-14 11 views
1

Je veux donc surcharger la suppression d'une classe virtuelle abstraite. Cela appellera deleteMe() dans la classe dérivée qui est dans une autre lib. Ceci est pour éviter les erreurs/accidents mentionnent ici C++ mix new/delete between libs?overloading delete, appel de fonction virtuelle pure

lorsque j'appelle supprimer moi de supprimer dans ma classe de base, j'obtiens l'erreur "pure virtuelle func call". Ensuite, je découvre qu'il a déjà appelé mon agent. Comment puis-je surcharger supprimer ou écrire ce code de telle sorte qu'il n'appelle pas le dtor afin que je puisse écrire delete obj; et l'appelle obj-> deleteMe() qui appelle alors sa propre fonction de suppression et le dtor?

+1

certains exemples de code pourraient aider à répondre à la question – orip

Répondre

6

Il semble que vous utilisiez l'opérateur delete comme une fonction normale supposée faire des choses arbitraires. Un opérateur delete, cependant, n'est supposé libérer que la mémoire qui lui est donnée comme premier argument, qui est un pointeur vers cette zone de mémoire.

Ce pointeur pointe vers l'emplacement de la mémoire à l'emplacement de votre objet. À ce moment, cependant, le destructeur de votre objet a déjà fonctionné, et votre objet n'existe plus. Vous ne pouvez pas appeler n'importe quelle fonction membre - même moins de fonctions virtuelles!

J'ai le sentiment que vous obtenez le but de l'opérateur supprimer mal. Si vous appelez delete pointer, le compilateur appelle le destructeur pour l'objet, puis appelle la fonction deallocation pour libérer la mémoire allouée, qui est appelée operator delete.

Eh bien, pourquoi ne pas utiliser la solution que nous vous avons montrée plus tôt, avec le boost::shared_ptr?

+0

J'utilise shared_ptr, quand il sort de la portée, il se bloque. Je voulais avoir l'obj supprimer naturellement avec le mot-clé delete. Il semble que je ne peux pas faire ça. Maintenant j'utilise shared_ptr avec std :: mem_fun comme 2ème param partout. Ça marche bien. –

+0

oui, j'ai commenté que l'un des gars répond que l'on appelle supprimer en plus d'appeler deleteMe. Je croyais que vous appelez "supprimer ceci"; dans cette fonction, il appellerait effectivement supprimer deux fois. –

+0

J'ai recommandé shared_ptr ptr (nouveau T, bind (& T :: deleteMe, _1)); , mais l'autre gars a posté l'autre réponse, et j'ai supprimé mon commentaire. –