2014-12-22 223 views
1

考慮下面的代碼:C++:刪除指針結構

struct A { 
    int someInt; 
}; 

A *a = new A; 
A *b; 

delete a; // ok 
delete b; // crash 

它崩潰了,但我不知道爲什麼。我認爲刪除空指針是沒有任何操作的。

我甚至需要刪除結構嗎?在堆上創建結構是不好的做法嗎?在堆棧上創建它們會更好嗎?

+0

所有這些代碼是在一個函數內部還是在一些內部?它有所作爲 –

回答

8

刪除空指針沒有操作,是的,所以如果b是空指針,那麼你會沒事的。

但事實並非如此。這是一個未初始化變量不確定值

這裏有一個空指針:

A* b = nullptr; 

(如果你在全局範圍內寫A* b;,或者如果你在一個函數寫static A* b;,或者如果你是定義一個類的靜態成員,然後b具有靜態存儲持續時間和自動零初始化你;這是一個例外)

而且,是的,你應該避免動態分配,其中可能—使用它沒有很好的理由你的代碼複雜化了,好了。 FO沒有理由。

+0

所以我需要明確地說'A * b = NULL;'? –

+0

@EikeCochu:是的。 –

2

b是一個未初始化的指針。沒有什麼可以刪除的。