Почему удаление указателя Actor приводит к тому, что "Program.exe вызвал точку останова"

Я пытаюсь создать Actor указатель, указывающий на другого Actor объект, вот так:

Actor other = Actor();
Actor* ptr = &other;

А потом, когда я пытаюсь delete ptr, это приводит к ошибке во время выполнения:

Program.exe вызвал точку останова

Но когда я создаю новый Actor вместо назначения ptr к ссылке otherМогу смело delete это без каких-либо ошибок:

Actor* ptr = new Actor();
delete ptr;

Я не понимаю, в чем проблема.

Вот то, что мой Actor класс выглядит так:

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

Я искал и натолкнулся на Правило Трех, но я не понимаю, какой оператор используется при установке указателя следующим образом:

Actor other = Actor();
Actor* ptr = &other;

Я думаю, что это конструктор копирования, но как мне реализовать его для моей программы?

1 ответ

Решение

И затем, когда я пытаюсь удалить ptr, это приводит к тому, что "Program.exe вызвал точку останова".

Ты можешь позвонить delete на указатель, только если память, на которую он указывает, была выделена в динамической памяти (то есть в куче) при вызове new оператор.

поскольку other вместо этого выделяется в автоматической памяти (т. е. в стеке), его нельзя освободить с помощью deleteИтак, что вы делаете, это неопределенное поведение.

Когда ваша программа попадает в область неопределенного поведения, может произойти все что угодно. Бесполезно разбираться в поведении программы.

Другие вопросы по тегам