Je suis en train de créer un pointeur Actor
qui pointe vers un autre objet Actor
, comme ceci:Pourquoi la suppression du résultat pointeur Acteur dans « Program.exe a déclenché un point d'arrêt »
Actor other = Actor();
Actor* ptr = &other;
Et puis, quand J'essaie de delete ptr
, il en résulte une erreur d'exécution:
Program.exe has triggered a breakpoint
Mais, quand je crée une nouvelle Actor
au lieu d'attribuer ptr
à la référence de other
, je peux en toute sécurité delete
sans aucune erreur:
Actor* ptr = new Actor();
delete ptr;
Je ne comprends pas quel est le problème.
Voici ce que ma classe Actor
ressemble:
Actor.h:
class Actor
{
private:
unsigned id;
string name;
vector< unique_ptr<Behaviour> > allBehaviours;
public:
Actor();
virtual ~Actor();
void Init(); // Go through all the behaviors and call their Inits and Ticks
void Tick();
}
Actor.cpp:
#include "Planet.h"
#include "Behaviour.h"
#include "Actor.h"
Actor::Actor()
{
win.GetCurrentPlanet()->AddActor(this);
planet = win.GetCurrentPlanet();
}
Actor::~Actor()
{
printf("Deleted Actor!");
if (allBehaviours.size() > 0)
allBehaviours.clear();
}
// Init and Tick and some getters, setters for name and id
Je l'ai cherché, et suis tombé sur The Rule of Three, mais Je ne comprends pas quel opérateur est utilisé lors de la définition d'un pointeur comme celui-ci:
Actor other = Actor();
Actor* ptr = &other;
Je pense que c'est le constructeur de copie, mais comment l'implémenter pour mon programme?
'other' situé dans la pile, et la mémoire ne doit pas être effacée. L'implémentation par défaut 'delete' essaie la mémoire libre du tas. et le gestionnaire de tas a déclenché le point d'arrêt lorsque vous essayez un pointeur non valide. – RbMm
En ce qui concerne la règle de trois, 'Actor other = Actor();' n'invoque pas du tout le constructeur de copie, il appelle le constructeur par défaut à la place. 'Actor other = Actor();' est juste la syntaxe du compilateur sugar pour 'Actor other;' –