提问人:Drin 提问时间:7/27/2017 最后编辑:Remy LebeauDrin 更新时间:7/27/2017 访问量:238
为什么删除 Actor 指针会导致“Program.exe触发了断点”
Why does deletion of Actor pointer result in "Program.exe has triggered a breakpoint"
问:
我正在尝试创建一个指向另一个对象的指针,如下所示:Actor
Actor
Actor other = Actor();
Actor* ptr = &other;
然后,当我尝试时,它会导致运行时错误:delete ptr
Program.exe触发了断点
但是,当我创建一个新的而不是分配给 的引用时,我可以安全地使用它而不会出现任何错误:Actor
ptr
other
delete
Actor* ptr = new Actor();
delete ptr;
我不明白问题出在哪里。
这是我的班级的样子: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赞
R Sahu
7/27/2017
#1
然后当我尝试删除 ptr 时,它会导致“Program.exe触发了断点”。
仅当指针所指向的内存是通过对运算符的调用在动态内存(即堆)中分配的时,才能调用指针。delete
new
由于是在自动内存(即堆栈)中分配的,因此无法使用 释放它,因此您正在执行的是未定义的行为。other
delete
当您的程序进入未定义行为的领域时,任何事情都可能发生。理解程序的行为是徒劳的。
评论
other
位于堆栈中,并且不得删除内存。默认实现 尝试从堆中释放内存。堆管理器触发断点时,当您尝试释放无效指针。delete
Actor other = Actor();
Actor other = Actor();
Actor other;