我試圖創建一個Actor
指針指向另一個Actor
對象,像這樣刪除:爲什麼的演員指針結果「的Program.exe引發斷點」
Actor other = Actor();
Actor* ptr = &other;
然後,當我嘗試delete ptr
,它導致運行時錯誤:
Program.exe has triggered a breakpoint
但是,當我創建一個新的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
我已經搜查,並在The Rule of Three來了,但我不明白在設置像這樣的指針時使用了什麼操作符:
Actor other = Actor();
Actor* ptr = &other;
我認爲這是複製構造函數,但是如何爲我的程序實現它?
'other'位於堆棧中,並且內存不能被刪除。默認'delete'實現從堆中嘗試釋放內存。當您嘗試釋放無效指針時堆管理器觸發斷點。 – RbMm
關於三規則,「Actor other = Actor();」根本不調用複製構造函數,而是調用默認的構造函數。 '演員其他=演員();''是'演員其他'的編譯器語法糖;' –