2013-08-02 62 views
5

我想知道是否有人可以闡明在C++中釋放內存過程。何時內存釋放與靜態變量有關?

如果我有我聲明靜態的結構體,使得它的構造是執行的第一件事,析構函數是執行的最後一件事:

struct initializer execute_before_and_after_main { 
    initializer() { init(); } 
    ~initializer() { cleanup(); } 
} 
static initializer execute_around_main; 

然後,我有這樣的事情:

class my_class { 
    my_object objects[100]; 
} 
extern my_class gobal_my_class; 
my_class global_my_class; 

和主在這裏並不重要:

int main (int argc, char* argv[]) { 
    .... 
} 

cleanup()被調用,是objects數組現在包含釋放/無效內存?是否有一個標準的初始化/破壞序列,C++在這裏實現,有人可能指向我?

感謝

編輯:我理解這種類型的代碼是可能不是最好的做法,但如果行爲定義,我仍然不知道。

+5

時間來熟悉初始化的全局我的課被破壞第一[存儲時間](http://en.cppreference.com/w/cpp/language/storage_duration) –

+0

@CaptainObvlious大聲笑我正要把我的回答中相同的鏈接 – aaronman

+1

沒有標準的定義序列的初始化和破壞靜態存儲持續時間的對象;這被稱爲[靜態初始化順序失敗](http://www.parashift.com/c++-faq/static-init-order.html) – Praetorian

回答

3

靜態和全局變量都有static storage duration這意味着程序結束時它們被釋放。通過閱讀其中一個重複項,我發現如果代碼全部位於同一個翻譯單元中(您的是),則具有靜態存儲的對象將按照與構造相反的順序被破壞。如果對象使用不同的翻譯單位,則不能保證任何內容。

當cleanup()被調用時,對象數組是否包含釋放/無效內存?

是,但它其實並不重要,因爲它僅調用一次的對象是超出範圍

execute_around_main之前global_my_class破壞?

肯定的,因爲它是最後

+0

「有沒有C++實現這裏初始化/銷燬的標準序列」,他們是在程序結束時'execute_around_main'銷燬過程中沒有解決的,如果'global_my_class'的內存是有效的問題都被釋放的事實。 –

+0

@MooingDuck所以如果我只能回答你覺得有必要downvote一半的問題,我會嘗試修復答案,但我不是什麼他試圖去撫 – aaronman

+0

「當清理()被調用100%清楚,是對象數組現在包含釋放/無效內存?「 - >「'global_my_class'在'execute_around_main'之前被破壞了嗎?」 –