0

我正在尝试创建一个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();
}

演员.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

我已经搜索过,发现了The Rule of Three,但我不明白在设置这样的指针时使用了什么运算符:

Actor other = Actor();
Actor* ptr = &other;

我认为它是复制构造函数,但是如何为我的程序实现它呢?

4

1 回答 1

1

然后当我尝试删除 ptr 时,它会导致“Program.exe 已触发断点”。

delete只有当指针指向的内存是通过调用运算符分配到动态内存(即堆)中时,才能调用指针new

由于other是在自动内存(即堆栈)中分配的,因此无法使用 释放它delete,因此您所做的是未定义的行为

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

于 2017-07-27T00:08:58.343 回答