Почему удаление указателя 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;

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

0

Решение

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

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

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

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

1

Другие решения

Других решений пока нет …