2017-07-27 46 views
0

我試圖創建一個Actor指針指向另一個Actor對象,像這樣刪除:爲什麼的演員指針結果「的Program.exe引發斷點」

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

然後,當我嘗試delete ptr,它導致運行時錯誤:

Program.exe has triggered a breakpoint

但是,當我創建一個新的Actor而不是分配給ptrother參考,我可以放心地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; 

我認爲這是複製構造函數,但是如何爲我的程序實現它?

+1

'other'位於堆棧中,並且內存不能被刪除。默認'delete'實現從堆中嘗試釋放內存。當您嘗試釋放無效指針時堆管理器觸發斷點。 – RbMm

+0

關於三規則,「Actor other = Actor();」根本不調用複製構造函數,而是調用默認的構造函數。 '演員其他=演員();''是'演員其他'的編譯器語法糖;' –

回答

1

And then when I try to delete ptr, it results in "Program.exe has triggered a breakpoint".

您可以在一個指針調用delete,只有當它在通過向new操作的調用動態內存(即堆)被分配指向的內存。

由於other自動存儲(即堆)代替,它不能與delete釋放被分配的,所以你在做什麼是不確定的行爲

當您的程序進入未定義行爲的領域時,任何事情都可能發生。理解程序的行爲是徒勞的。

+0

這使得很多的意義,非常感謝你! – Hello