2012-05-30 35 views
3

我有一些代碼,把一堆TNotifyEvents載體在C++ builder 2010中奇怪的「隨機」內部編譯器錯誤

std::vector<TNotifyEvent> m_availableCallbacks; 

這是應用程序的主要形式的成員。在窗體構造函數中,它充滿了事件。

m_availableCallbacks.push_back(ReadoutLastValue); 
m_availableCallbacks.push_back(ReadoutCurrentDay); 
m_availableCallbacks.push_back(ReadoutLastDay); 
m_availableCallbacks.push_back(Readout7Days); 
m_availableCallbacks.push_back(Readout1Month); 
m_availableCallbacks.push_back(ReadoutChooseTimeSpan); 
m_availableCallbacks.push_back(ReadoutAllData); 

該載體然後重複並用於創建一個彈出菜單和分配通知事件以在彈出菜單中的元素。

在本地編譯這個沒有問題。當我在編譯服務器上編譯它(運行TeamCity 6.5)時,我得到的內部編譯器錯誤等於第二個push_back調用。

我試圖通過編輯cbproj文件上生成代理禁用智能緩存預編譯頭本地。這產生了一個成功的構建。因此,我刪除了指令,使用智能高速緩存預編譯頭文件從所有cbproj文件並提交了更改。我告訴TeamCity做了一個Clean Checkout並且我再一次在同一個地方得到了相同的內部編譯器錯誤。奇怪的是,在失敗的成功後運行一個新的編譯,所以這感覺非常隨意。

這是怎麼回事?我習慣於在其他C++編譯器中傳遞函數指針(由我自己編寫)。內部處理是否被破壞或者編譯器是否不穩定並且很容易被破壞?

看着其他代碼TNotifyEvents他們不工作的引用或指針,所以我沒有嘗試。而且由於代碼(編譯時)按預期工作,似乎不成問題。

更新:

我可以補充的是,日誌的TeamCity說,FrontEnd.cpp文件(包含此代碼),是跳過當我重新運行編譯並且取得了成功。

[10:04:37]: [MakeObjs] CallTarget 
[10:04:37]: [CallTarget] _CppDepCheck 
[10:04:44]:  [_CppDepCheck] MessageMap 
[10:04:44]:  [MessageMap] Skipping: ..., FrontEnd.cpp, ... 

而且爲了使編譯工作甚至在內部編譯器錯誤發生時必須成功。它怎麼會跳過編譯這個文件,並且它仍然神奇地出現並且以編譯的形式被使用? :)

UPDATE2

調查後我可以證實,這發佈模式編譯時只發生。在發行版中它甚至發生在我的本地機器上。 我曾嘗試與設置擺弄像

  • 禁用所有優化
  • 生成最快的代碼可能
  • 外部類型的文件

清洗之間的每一個嘗試構建。 但ICE不會消失。然而,我確實設法讓它抱怨另一個文件中的另一個地方。將設置恢復到之前的狀態不會使錯誤返回到FrontEnd.cpp文件。這個編譯器感覺有點不穩定:)

事實上,我開始讓代碼遍佈ICE,並且必須重新啓動IDE才能編譯任何東西。

+0

當我廣泛使用函數指針時,我已經有了和BCB2010類似的ICE。對我來說,當將一個裸函數指針傳遞給一個預期爲'boost :: function'的函數作爲參數時,這個問題會隨機出現。傳遞'boost :: bind(&class:function,this)'似乎爲我修復了它。到目前爲止... – Roddy

回答

0

這似乎與std :: vector連接。不知道它是由自己破壞還是由處理的方式密碼錯誤是問題所在。但切換到C風格的陣列作爲測試,而不是讓ICE消失,現在它在調試和發佈模式下都能正常工作。

TNotifyEvent m_availableCallbacks[7]; 

我想避免這種情況,因爲添加新的事件的載體將涉及幾乎只有一行代碼。現在還有一點要記住要改變。但是,最好有應用程序編譯。

如果我錯了,認爲這是BCC中的一個錯誤,請糾正我,以便我可以回去儘快使用矢量:)...否則,我希望Embarcadero儘快修復此問題。

+0

對於那些感興趣的這已被報道Embarcadero作爲ID 106025 – inquam