为什么删除执行组件指针会导致"Program.exe has triggered a breakpoint"



我正在尝试创建一个指向另一个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释放它,所以你正在做的是未定义的行为

当你的程序进入未定义行为的领域时,任何事情都可能发生。理解程序的行为是徒劳的。

相关内容

最新更新