J'utilise l'héritage virtuel avec une sélection de classes en C++. Il plante actuellement sur la destruction. Il semble bien se compiler dans les compilateurs en ligne, mais quand je cours dans Visual Studio, il plante.Placement d'un nouveau plantage lorsqu'il est utilisé avec la hiérarchie d'héritage virtuel dans Visual C++
J'ai une classe de base virtuelle pure, héritée virtuellement par son implémentation. J'ai ensuite une troisième classe qui hérite de la mise en œuvre régulièrement. J'utilise un système interne pour créer et libérer de la mémoire. Sous le capot il utilise un placement neuf avec un malloc aligné. Il utilise ensuite gratuitement pour libérer la mémoire. J'ai créé cet exemple minimum. Ce n'est pas exactement ce que je suis en train de faire, mais j'ai l'impression d'avoir un problème similaire.
#include <iostream>
#include <string>
int main()
{
class Animal {
public:
Animal() { }
virtual ~Animal() { }
virtual void eat() { }
};
class Mammal : public virtual Animal {
public:
virtual void breathe() { }
};
class WingedAnimal : public virtual Animal {
public:
virtual void flap() { }
};
// A bat is a winged mammal
class Bat : public Mammal, public WingedAnimal {
};
Animal* bat = new(malloc(sizeof(Bat))) Bat;
bat->~Animal();
free(bat);
printf("Done!");
}
Comme je l'ai dit, cet exemple affichera "Terminé" dans le compilateur en ligne. Cependant, dans Visual Studio 2015, il semble se bloquer sur l'objet chauve-souris. Je suis assez nouveau pour l'héritage virtuel et le placement nouveau. Quelqu'un voit-il le problème?
@Barry http://cpp.sh/2vd4t fournit exactement cela ... coller dans le studio visuel et vous avez le problème. Voici un en ligne que vous pouvez utiliser: http://webcompiler.cloudapp.net/. Comme je vois beaucoup cette réponse sur presque toutes mes questions. Peut-être pourriez-vous indiquer ce qui me manque pour pouvoir m'améliorer dans le futur? – marsh
La publication de liens vers le code est déconseillée. Code postal dans la question elle-même. –
@jeff Il utilise la nouvelle syntaxe placement, donc malloc alloue juste la mémoire brute; new l'initialise en tant qu'objet C++. Puis il appelle explicitement le destructeur et appelle gratuitement. C'est légal. Et les classes dérivées ont toujours un destructeur virtuel lorsqu'elles héritent d'une classe qui en a un. –