2014-10-06 150 views
0

我有一個C++代碼:C++構建全局變量

// includes, variables etc... 
GraphStructure graphStructure; 

void getInput() { 
    graphStructure = GraphStructure(nodesCount, edgesCount); 
    // HERE, the destructor is called! 
    graphStructure.init(nodesCount, edgesCount); 
    // Same code as constructor, but now its okay. 
} 

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

我想知道,爲什麼對象的析構函數其施工後直接調用。析構函數在變量作用域的末尾被調用,它應該在主函數結束之後。

+0

你知道...... C++沒有GC,所以它不會調用析構函數,除非你告訴它 – Steve 2014-10-06 19:13:54

+0

@Steve:不一定是真的。如果你在棧上創建一個類類型的對象,析構函數在超出作用域時或者編譯器認爲沒有副作用時會被調用,並且在超出作用域之前可以處理它。後者是我認爲在這裏發生的事情。 – 2014-10-06 19:17:32

+0

你必須遵守三個(或五個)的規則 - 寫一個適當的賦值操作符 – 2014-10-06 19:30:42

回答

3

GraphStructure(nodesCount, edgesCount)臨時實例GraphStructure。因此,它的析構函數在包含它的完整表達式被評估時(結尾在分號;)被調用。

如果它是一個本地實例,將通過getInput(),不main()範圍的約束。它的析構函數在編譯器到達getInput()的末尾時(在結束大括號}之前)會被調用。當main完成執行時,main中任何局部變量的析構函數都會被調用。