2011-09-23 87 views
2

當前Visual C++隨運行時一起提供,其中malloc()__declspec(restrict)裝飾。「指針未被任何其他指針混淆」的持續時間是多少?

MSDN說,這裝修狀態到通過malloc()返回一個指針不能被任何其他指針的別名編譯器。好的,後續調用malloc()確實返回不同的指針。但是如果我打電話,會發生什麼?

void* memory1 = malloc(10); 
free(memory1); 
void* memory2 = malloc(10); 
//here memory1 may be equal to memory2 

在這種情況下,兩個指針可以指向相同的位置。這與不能混淆的任何其他指針暗示__declspec(restrict)

+1

我不明白這個問題。這裏沒有別名,free'd不再存在。在技​​術上解引用'memory1'就是UB。 – Mat

+0

@Mat:看起來像一個答案。 – sharptooth

回答

3

標準是這樣說的關於「對象生存期」時(N3290§3.8):

類型T的對象的生存期結束時:
- 如果T是一個類類型與非平凡析構函數(12.4),析構函數調用開始,或者
- 對象佔用的存儲空間被重用或釋放。

當您的free'd指向memory1指定的塊後,該對象已死亡。它已不復存在。解引用該指針將是未定義的行爲。

memory2可以被分配相同的存儲器地址,但它不會「別名」任何東西:在那個位置已經過去了。

4

因爲一旦你釋放(memory1),通過memory1指針訪問任何東西都是未定義行爲(鼻惡魔等等),因此編譯器可以優化,假設memory2沒有被malloc之後的任何其他指針別名)電話。

至於爲什麼這很重要,假設編譯器本身沒有關於malloc()的語義的內部信息,也就是說它像對待任何其他函數一樣對待它,那麼它不能假定返回的指針沒有被任何別名其他指針。 __declspec(restrict)(或等效於GCC中的__attribute__((malloc)))告訴編譯器該指針沒有被任何其他指針別名,這使得其他優化不可能進行。

+0

「因爲一旦你釋放(memory1),不允許通過memory1指針訪問任何東西......」:它實際上是允許的,並且導致未定義的行爲。不允許恕我直言,意味着另一件事。 「編譯器可以優化,假設memory2沒有別名到malloc()之後的任何其他地方()」???這並不清楚:什麼是「別名」?它剛被分配! –

+0

@Emilio:夠好的,固定的。 – janneb

+0

@Emilio:我不明白你編輯的評論。請澄清? – janneb