2017-07-27 3 views
0

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?

+1

'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

+0

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;' –

Répondre

1

And then when I try to delete ptr, it results in "Program.exe has triggered a breakpoint".

Vous pouvez appeler delete sur un pointeur que si la mémoire qu'il pointe du doigt a été alloué en mémoire dynamique (ie, le tas) par un appel à l'opérateur new.

Depuis other est attribué en mémoire automatique (c.-à-la pile) à la place, il ne peut pas être libéré avec delete, donc ce que vous faites est un comportement non défini . Lorsque votre programme entre dans le domaine du comportement indéfini, tout peut arriver. Il est futile de donner un sens au comportement du programme.

+0

Cela fait beaucoup de sens, merci beaucoup! – Hello