2011-10-04 45 views
3

我有一個指向某些數據的指針。現在我創建了一個類似的指針。現在這個新的指針被分配給舊的指針。如果我刪除舊的會發生什麼?當我們將一個指針指向NULL時會發生什麼?

A* a = new A(); 
A* b = a; 
a = NULL; 

「a」和「b」會發生什麼?

而且,如果我做以下的事情:

A* a = new A(); 
A* b = a; 
delete a; 

而且我也想知道,當我們分配爲NULL會發生什麼指針。

A* a = new A(); 
a = NULL; 

做了仍然指向一些內存或者它指向什麼?

+0

它指向地址爲0x00000000的存儲器(或64位機器的0x0000000000000000 :)) – sehe

+2

@sehe:不,它指向NULL,根據架構不同,它可能是也可能不是0x0。 – Hasturkun

+1

@Hasturkun:FUD。在C++中,NULL **是** 0(來自馬嘴:http://www2.research.att.com/~bs/bs_faq2.html#null) – sehe

回答

14
A* a = new A(); 
A* b = a; 
a = NULL; 

在此之後,b仍然指向第一行中分配的對象。 a現在指向沒有。您仍然可以通過b指針「使用」對象,並且可以通過delete b;刪除對象。
你可以在這裏delete a; - 它不會有效果(因爲a是NULL),但它是安全的,不會導致未定義的行爲。

A* a = new A(); 
A* b = a; 
delete a; 

delete之後,該ab用於指向該對象不再存在。因此,ab不再是有效的指針,你不能對使用它們的值做任何事情。特別是,試圖去定義任何一個指針都會導致未定義的行爲。 (但你可以重複使用的變量,如果你讓他們指向一個有效的對象。)

A* a = new A(); 
a = NULL; 

你剛剛泄露的第一行創建的對象。 a不再指向任何東西,並且您沒有該對象的句柄,因此您無法刪除它。所以,這是一個普通的舊內存泄漏。
(如在第一種情況下,你可以delete a;a = NULL;行之後,但它不會有任何效果,記憶依然泄露。)

+0

可以補充一點,爲了完整性,'NULL上的delete/free是安全的,不會導致UB'。 – iammilind

+0

至於第二種情況下,它不是真正準確的說,'了'和'B'指向同一個已刪除的對象,因爲一旦它已被刪除,沒有對象。根據標準,在刪除之後,'a'和'b'都是無效指針,只讀取指針值(如'a!= NULL')是未定義的行爲。 –

+0

@JamesKanze:謝謝,我對這個案子沒有足夠的認識。修改該段,我現在認爲它是準確的。 – Mat

5
A* a = new A(); 
A* b = a; 
a = NULL; 

會發生什麼都「a」和「 b「?

一個將是NULL,b是未修改

A* a = new A(); 
A* b = a; 
delete a; 

*a已被刪除,並b成爲無效的(你一定不要提領B(*b)更多過去的那點) 。

而且我想知道當我們賦值爲NULL時指針會發生什麼。

A* a = new A(); 
a = NULL; 

*a刪除,所以內存泄漏。內存不能再被釋放(除非你在其他地方有指針的副本,但是代碼沒有顯示)。

+0

如果我將任何新指針指定給a,然後將其作爲null,該怎麼辦。然後刪除一個。 –

+0

@Apoorvasahay:這沒有什麼意義。你**不能** [1]「分配任何新的指針到一個」或「做一個空值」,然後[2]刪除一個。 **其實你不能'刪除'**。您只能刪除* a。你需要''a'的地址(一個指針或一個引用來取地址),以便能夠刪除它。 – sehe

2
A* a = new A(); 
A* b = a; 
a = NULL; 

b一直指向Aa指向地址0x0,解除引用會導致段錯誤。

A* a = new A(); 
A* b = a; 
delete a; 

兩個ab點到A一旦被實例化的地址空間。現在,A被刪除,您既不應該取消a也不要b,因爲它可能段錯誤。

A* a = new A(); 
a = NULL; 

現在a指向地址0x0和A在網絡空間的丟失。你泄漏了記憶。


有點晚了。再次。

+1

'指向0x0'在技術上是不正確的,空指針不必指向地址0,這是一個實現細節。 'A'是一個類型,而不是一個對象。沒有什麼可以「指向A」,但事情可以指向A. – Mat

+0

的實例完全同意。這讓我遲到和跛腳。 –

1

@apoorva「如果我將任何新指針指定給a,然後將其作爲null,然後刪除a,該怎麼辦。 它沒有任何效果..i.e你不會釋放新的A()所佔用的內存,只是因爲a = null,而你試圖刪除一個;它現在包含NULL。

相關問題