2013-03-26 35 views
0

可以在下面的程序中刪除空指針。在分配原始類型後刪除空指針

class Sample 
{ 
    public: 
     int intVal; 
     float floatVal; 
}; 

main() { 
    Sample *samObj = new Sample(); 
    void *vPtr = samObj; 
    delete vPtr; 
} 

這只是我寫的一個示例程序。實際上,在我的項目中,我除了做類似的事情之外別無他法。這個類似的代碼在.h接口文件中,當我包含這個文件並編譯其他組件時,編譯器會給出一個警告消息,因爲「警告:刪除'void *'是未定義的」,但是我懷疑是因爲我已經分配了void使用Sample對象類型的指針,刪除這個指針是否安全?

+0

可能在這裏找到答案http://stackoverflow.com/questions/941832/is-it-safe-to-delete-a-void-pointer – 2013-03-26 04:47:35

+0

在您的示例代碼中,您並未刪除'vPtr',你正在刪除'samObj',這很好。 – 2013-03-26 04:48:45

+0

你究竟想要完成什麼?只要刪除'samObj','vPtr'就沒有用,因爲你已經有效地刪除了它。 – Mysticial 2013-03-26 04:52:25

回答

1

對空指針的調用刪除是未定義的行爲[Ref]。你不應該這樣做。你不是在void指針上調用delete,而是在Sample類型的指針上調用,這很好。

[參考文獻] C++標準:第5.3.5節/ 3:

在第一種方式(刪除 對象),如果靜態類型 操作數是從它的動態 不同類型,靜態類型應該是基類 操作數的動態類型 的類,並且靜態類型應具有 虛擬析構函數或行爲爲 未定義。在第二個替代方案 (刪除陣列)中,如果要刪除的對象的動態類型爲 與其靜態類型爲 不同,則行爲爲 未定義。

註腳:

這意味着一個對象不能是 使用類型爲void * 的指針被刪除,因爲有 類型爲void

+0

謝謝阿洛克...我必須找到一種替代方法。我的項目中的問題非常棘手。我有一個線程,它採用void *參數,因此,用戶可以將任何想要的線程類型傳遞給它。他會開始線程並忘記它。現在,我必須小心刪除用戶分配的內存,但問題是他可以傳遞任何類型的參數。不知道,如何解決這個問題。 – Santosh 2013-03-26 05:20:53

0

否沒有對象,它是不安全的刪除一個void指針。編譯器應該如何「知道」vPtr指向什麼?編譯器不能;運行時間可能會,但事實並非如此。

爲什麼編譯器需要'知道'vPtr指向什麼?調用析構函數並知道要釋放多少內存。如果編譯器在每次分配時都保留一個標準頭,可能需要釋放多少內存纔不是一個大問題。但我想這是編譯器的一個細節,所以即使在這個部門中,結果也是'未定義的'。

+0

標題有誤導性。看代碼; OP在'Sample *'上調用'delete',這很好。我不知道這是否是一個錯字或什麼,但代碼沒有問題。 – 2013-03-26 04:52:30

+0

我明白你的觀點;是的,刪除實際上不在void指針上。編譯器不應該抱怨。 – Amit 2013-03-26 05:05:28

+0

是啊,我覺得OP有點困惑... – 2013-03-26 05:13:53

0

代碼顯示正常。 只要你記住點void *vPtr爲空或任何存在。

當您刪除void *vPtr時出現真正的問題,因爲編譯器不會刪除您要刪除的對象,也不知道可以釋放多少內存。