2015-11-27 71 views
0

據我所知,}實際上包含一些操作,例如銷燬堆棧分配的對象,因爲當對象的析構函數發生某種錯誤時,VS.NET指向我關閉卷曲大括號,甚至你可以使用F11進入它,看看被調用的析構函數中發生了什麼。但是,我注意到{也是一種操作,如果我嘗試使用F11來介紹它,VS.NET會告訴我它需要memset.asm文件來調整調試。大括號中發生了什麼

{以內真的發生了什麼?

+4

其實大括號本身不是操作符,它們「包含」沒有代碼。編譯器會添加代碼,然後作用域開始和結束,但它並不與花括號關聯(除非它們顯示作用域開始和結束的位置)。當你進入例如析構函數,它是在代碼之後但在範圍的實際結束之前插入的代碼。光標結束於右括號是因爲調試器沒有任何其他位置信息。 –

+0

我得到了它的感謝。所以,我的問題應該是我的代碼在範圍開始之前發生的情況 –

回答

2

大括號確定範圍和壽命。在一對花括號內創建的對象無法在其外部訪問。他們不是代碼;但是,由於對象在退出時可能會被釋放,因此編譯器可能會因爲大括號而產生代碼。

關於進入開啓大括號的步驟,您實際上正在進入大括號內的第一個可執行代碼行。該代碼行將解釋爲什麼調試器試圖進入memset.asm。

+0

謝謝,但是這條嘗試進入memset.asm的行不是由我寫的。正如@jachim在他的評論中所說的那樣,這一行是由編譯器生成的,我的問題是關於那裏發生的事情。 –

+0

大括號內必須有內容。無論什麼都必須調用memset。請注意,在C++中使用本地語言語句會導致類似的情況,因爲您試圖插入編譯器自身生成的代碼的代碼。例如:如果你正在聲明一個數組,編譯器可能使用memset來清除內存。這是編譯器特有的。 – markshancock

+0

我明白了,謝謝 –