Я пытаюсь создать 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;
Я думаю, что это конструктор копирования, но как мне реализовать его для моей программы?
И затем, когда я пытаюсь удалить ptr, это приводит к тому, что «Program.exe вызвал точку останова».
Ты можешь позвонить delete
на указатель, только если память, на которую он указывает, была выделена в динамической памяти (то есть в куче) при вызове new
оператор.
поскольку other
вместо этого выделяется в автоматической памяти (т. е. в стеке), его нельзя освободить с помощью delete
так что вы делаете неопределенное поведение.
Когда ваша программа попадает в область неопределенного поведения, может произойти все что угодно. Бесполезно разбираться в поведении программы.
Других решений пока нет …