2012-04-19 38 views
0

我有一個奇怪的問題,試圖讓我的發佈版本在Xcode 4.2中使用llvm工作。我已經關閉了發佈方案的所有優化設置,並且據我所知,發佈版本與調試版本的所有設置相匹配。無論如何,使用Box2D(一個物理庫)的某些結構時會發生以下問題 - 但我不確定問題是否具體說明了該問題。錯誤發佈版本,從std :: vector複製結構

b2CircleShape* circleShape = new b2CircleShape(); 

circleShape->m_p.Set(0,0); 
circleShape->m_radius = m_radius; 

b2FixtureDef fixture; 
fixture.shape = circleShape; 
fixture.density = m_density; 

m_fixtureDefs.push_back(fixture); // std::vector 

b2FixtureDef fix2 = fixture; 
b2FixtureDef fix3 = m_fixtureDefs[0] // EXC_BAD_ACCESS 

當我刪除所有對m_fixtures的訪問實例時,沒有發生任何問題。當我在開發計劃中運行時,不會發生錯誤。我真的,真的很困惑,如果有人能在正確的方向指向我的錯誤尋找它,將不勝感激

編輯:

更多有趣的東西

for (vector<b2FixtureDef>::iterator i = m_fixtureDefs.begin() ; i != m_fixtureDefs.end(); ++i) 
{ 

} 

這似乎循環永遠,讓我非常困惑。看起來像結構m_fixturesdef有一些問題,但我不知道爲什麼奇怪的腐敗只發生在這個特定的變量。

+0

它看起來像一個內存錯誤,所以它將很難調試。你應該嘗試用valgrind運行它。另外,是否可以在'm_fixtureDefs'之前將'circleShape'刪除? – juanchopanza 2012-04-19 05:45:42

+0

我現在就試試。不,第一個摘錄是代碼中的「原樣」。 – Tomas 2012-04-19 05:55:50

+0

檢查默認構造函數b2FixtureDef :: b2FixtureDef()並複製構造函數b2FixtureDef :: b2FixtureDef(const b2FixtureDef&)b2FixtureDef :: operator =(const b2FixtureDef&)。使用調試打印查看變量值和程序流程。 – alexander 2012-04-19 06:23:24

回答

2

默認情況下,POD對象不會在C++中初始化,因此它們的初始值(除非明確初始化)本身是隨機的。

當您在調試模式下編譯時,編譯器通常會插入額外的初始化代碼來清零值。因此,您可以輕鬆看到調試和發佈版本之間的不同行爲。

找到這種問題的一種快速方法是檢查您的編譯器警告;看看你是否在初始化之前使用變量(你可能需要打開警告)或類似的東西。

注意:您可以通過確保您的代碼編譯爲零警告並且警告級別合理(通常高於默認值的步驟)來修復很多嚴重問題。 (警告在您的代碼中確實是一個邏輯錯誤)。

+0

我沒有任何編譯器警告,並且該項目也通過鐺。找到問題的任何提示? – Tomas 2012-04-19 06:16:02

+0

@TomasCokis:你打開了所有的警告嗎?我的絕對最小值是'-ansi -pedantic -Wall -Werror'雖然我通常還有其他一些:'-ansi -pedantic -Wall -Werror -Wextra -Wstrict-aliasing -Wunreachable-code -Wshadow-WeffC++'XCode coompiler has同樣的標誌會打開它們,看看會發生什麼。 – 2012-04-19 15:59:16

+0

我打開了一堆警告,修復了一些文件結尾和其他一些不重要的東西,將項目設置搞亂了一個小時,恢復了項目文件,突然之間再次運行。我不太確定問題出在哪裏,但我會接受這一點,因爲這些警告似乎導致我解決了這個問題 – Tomas 2012-04-22 01:16:24

相關問題