我正在尝试创建一个指向另一个Actor
对象的Actor
指针,如下所示:
Actor other = Actor();
Actor* ptr = &other;
然后,当我尝试delete ptr
时,它会导致运行时错误:
程序.exe触发了断点
但是,当我创建一个新Actor
而不是将ptr
分配给other
的引用时,我可以安全地delete
它而不会出错:
Actor* ptr = new Actor();
delete ptr;
我不明白问题是什么。
这是我的Actor
课的样子:
演员:
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();
}
演员.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时,它会导致"程序.exe触发了断点"。
仅当指针指向的内存是通过调用new
运算符在动态内存(即堆(中分配的时,才能在指针上调用delete
。
由于other
是在自动内存(即堆栈(中分配的,因此不能用delete
释放它,所以你正在做的是未定义的行为。
当你的程序进入未定义行为的领域时,任何事情都可能发生。理解程序的行为是徒劳的。