J'expérimente avec la suppression d'opérateur de surcharge, de sorte que je puisse retourner un pointeur simple à ceux qui ne souhaitent pas travailler avec des pointeurs futés, et être capable de contrôler quand l'objet est supprimé.opérateur de surcharge supprimer, ou comment tuer un chat?
Je définis une classe Cat qui est construite avec plusieurs âmes, a une suppression d'opérateur surchargée qui ne fait rien, et un destructeur qui décrémente le nombre d'âmes (et fait aussi quelques vantardises). Quand les âmes atteignent 0, le destructeur appelle le global :: delete, et le chat meurt.
Cela semble assez simple, mais ne fonctionne pas comme prévu. Voici le code:
class Cat {
public:
Cat(string n): name(n), souls(9)
{ cout << "Myaou... " << name << " is born\n"; }
~Cat();
void operator delete(void *p) { cout << "!!! operator delete called\n"; }
void report()
{ cout << name << "'s here, " << souls << " souls to spend\n"; }
friend ostream& operator<< (const ostream& o, const Cat& cat);
private:
void kill();
const string name;
int souls;
};
Cat::~Cat()
{
cout << "!!! dtor called\n";
kill();
}
void Cat::kill()
{
if (--souls)
cout << name << " is still alive! I have " << souls << " souls left.\n";
else {
cout << name << " is dying... good bye world!\n";
::delete((void*)this);
}
}
ostream& operator<< (const ostream& o, const Cat& cat)
{
return o << cat.name << "'s here, " << cat.souls << " souls to spend\n";
}
est ici le principal:
int main()
{
Cat *p = new Cat("Mitzi");
for (;;)
{
char c[100];
// cout << *p;
p->report();
cout << "come on, hit me!";
cin >> c;
delete p;
}
}
Je pense que la boucle courrait pour 9 fois, puis quelque chose de désagréable (accident) se passerait-il. Cependant, ceci est la sortie:
Myaou... Mitzi is born
Mitzi's here, 9 souls to spend
come on, hit me!c
!!! dtor called
Mitzi is still alive! I have 8 souls left.
!!! operator delete called
's here, 8 souls to spend
come on, hit me!c
!!! dtor called
is still alive! I have 7 souls left.
*** glibc detected *** /home/davidk/workspace/string_test/Debug/string_test: double free or corruption (fasttop): 0x080cd008 ***
Paraît que, après la première supprimer le membre de nom est détruit, et la prochaine suppression provoque un accident. Des explications? Je compile avec gcc sur Linux, peut être un bug de compilateur?
BTW, quand je l'opérateur < <() comme dans Cout < < * p au lieu de repotr(), il était aussi bizarre: il est entré dans une boucle infinie d'appeler le constructeur à partir de l'opérateur < <() . Que se passe t-il ici? :)
merci!
hey, tirer CMyFoot mais pas le pauvre chat! –