2012-11-03 71 views
3

我是C++新手,現在正在研究newdelete關鍵字。C++刪除內存位置的運算符

Point ppaa = *new Point; 
Point *p = &ppaa; 

ppaa.xpos = 1; 
ppaa.ypos= 3; 

delete &ppaa; 
delete p; 

能否請您解釋一下爲什麼我不能刪除上面使用& PPAA的PPAA? 我知道刪除只能操作指針,但我不明白爲什麼以上是不可能的,因爲它們實際上是內存位置。搜索類似的問題,似乎這與第一行的複製操作有關,但我沒有很好的解釋。

+0

您正在泄漏內存。這可能有所幫助:http://stackoverflow.com/questions/8839943/why-does-the-use-of-new-cause-memory-leaks/8840302 – Pubby

+0

感謝Pubbu,它幫了很多。你能否看看根據Als的回答發佈的額外問題? – noclew

回答

3
T t = x; 

被稱爲拷貝初始化。它:

  • 它試圖x轉換爲類型T &
  • 的對象,然後在該對象進入到初始化的對象t副本。

所以,你的代碼語句,

Point ppaa = *new Point; 
  • 創建上的FreeStore /堆Point obejct和
  • 然後將複製對象來創建一個堆棧對象ppaa

這兩個對象都是不同的對象。
如您所見,執行此語句後,您再也沒有任何指向堆對象的指針。
在這種情況下,您需要將由new返回的地址傳遞給delete,由於您沒有該地址,導致內存泄漏。
另外,請注意,&ppaa不會返回由new返回的地址,它會返回位於堆棧上的對象ppaa的地址。將此地址傳遞到delete導致未定義的行爲,因爲ppaa從未在freestore /動態分配,它是基於堆棧的本地/自動對象。

+0

非常感謝您的親切解釋。現在我可以看到代碼中的工作情況了!我用c#一段時間,所以這個複製初始化對我來說很有意思。要清楚,如果我在c#中編寫(不在C++中):T t1 = new T(); T t2 = t1;那麼t2只是t1的一個引用,並且沒有像C++那樣的複製過程。我對嗎? – noclew

+0

@noclew這是正確的。 – Pubby

+0

非常感謝Pubby和Als! – noclew