2013-10-20 84 views
1

說我有這樣的:指針在分配之前是否佔用內存?

int *thing; 

在於,使用4個字節的內存,即使我什麼也沒有分配給它?當我分配一些東西(thing=new int;)時,它會使用8個字節,因爲指針本身可能使用內存?

而且,說我有這樣的:

struct thingy 
{ 
    int *intThing; 
} 

thingy *result=new thingy; 
thingy.intThing=new int; 
delete thingy; 

intThing被刪除爲好,或將內存懸空周圍什麼也沒有指向它?

+0

顯然它佔用空間;當你聲明一個變量時,會爲它分配存儲空間(除非編譯器將它優化掉,但我們不要談論它)。而「刪除」並不意味着「從內存中物理刪除」。它只是意味着「告訴操作系統我不打算再使用這個內存區域」。 – 2013-10-20 05:44:07

+0

指針是一個「保存」地址的變量,但這並不改變簡單的事實,它仍然是一個變量,因此它是可尋址的,因此佔用空間本身。那裏的空間「是」是另一回事,但它總是必須坐在「某個地方」。 – WhozCraig

回答

1

所有變量(基本數字類型,類實例,指針,引用)開始佔用空間。

然後都要涉及到優化,並可能顯示一些存儲是多餘的(該值是恆定的,或者從另一個變量總是可用的,等等)

決策變量消失時的優化,因爲明確的目標之一它傾向於減少註冊壓力,提高緩存性能等。

在您的示例中,指針intThing將被銷燬(它是一個成員,並且成員在他們的父對象時死掉),但它指向的內存正確地被稱爲*thingy.intThing而不僅僅是thingy.intThing)不會。如果其地址沒有存儲在其他地方,則會被泄露。

+0

所以爲了澄清,正確的代碼是'delete thingy.intThing;刪除thingy;'? – Clonkex

+0

@Clonkex:沒錯。或者使用像'std :: unique_ptr'這樣的智能指針來完成它。 –

1
  1. 一個指針大小取決於機器和OS它在創建。
  2. 如果您有或沒有分配任何東西給它,它將使用內存。
  3. 當刪除具有指向*intThingy
+0

你的意思是「指向'* intThingy'」,對吧? 'intThingy'是一個指針,在這個問題中我沒有看到任何雙指針......「一個指向'intThingy'的指針在這裏不存在 –

+0

@BenVoigt正確,修正。 – Caesar

0

指針本身是一個對象/變量這會佔用空間的指針的對象(無論是在堆棧或堆)intThingy不會被刪除,從而當不可不要與它所指的內容混淆。即使char *p = nullptr佔用了sizeof(*p)字節的空間。

該標準保證機器中所有指針類型的大小都是相同的I.e. sizeof(char *)== sizeof(void *)== sizeof(int *)爲true。它取決於編譯器和目標機器的體系結構。

主機是您編譯代碼的地方,而目標機器是您打算運行代碼的地方。這兩個可以不同,在這種情況下,它被稱爲交叉編譯。只有主機特性很重要(編譯器也是如此)。說,如果宿主是64位,但你的編譯器僅是32位,則該指針尺寸可以僅4個字節,而不是8

delete thingy;後指向的對象由thingy將被刪除,但不thingy本身。但是thingy仍然會指向存在刪除對象的內存。試圖解引用它會導致未定義的行爲(主要是崩潰)。因此刪除後通常設置爲NULL。然而另一個陣營認爲將其設置爲NULL是有風險的,因爲不正確地嘗試「重新刪除」指針不會崩潰,因爲它應該(刪除NULL是無操作),從而隱藏了一個錯誤。

+0

有錯字,可能是'sizeof(p)' – kotlomoy

+0

是的,我在編輯它。謝謝! – legends2k

0

指針是一種類似於C++中其他類型的類型。指針本身在內存中佔用空間,只能指向創建該指針時指定的數據類型。

所以,即使你沒有分配給它,指針也會佔用內存空間。具體多少內存空間取決於它創建的機器。