2013-04-26 85 views
0

我已經編寫了一個win服務器應用程序C.我必須將它編譯爲.dll,並將其作爲32位.dll一臺32位機器,它的工作原理非常漂亮。但是,當我使用cmake工具編譯爲64位,並將相同的代碼放在64位機器上並指定它爲64位編譯時,並且我運行該程序時,它崩潰在釋放一些內存的行上。c應用程序在64位窗口中崩潰,但在32位win服務器上工作正常

我的問題是這是什麼原因造成的?爲什麼編碼完全相同的程序會在64位機器上的64位版本上免費使用內存,而在32位機器上則不會使用32位版本?是贏得32位服務器和贏64位服務器的任何區別。請幫助我在兩種類型的Windows操作系統中獲得內存結構的差異。

版本信息:我使用Visual Studio 2010中,贏得2008 R2

+4

如果您需要幫助而不是猜測,請顯示一些代碼。 – 2013-04-26 07:13:24

+1

你可能寫了一個不可移植的代碼。 – 2013-04-26 07:23:39

+0

這是我期望的通用贏64位內存問題。所以請給我關於贏得32-64位場景之間的區別,這將導致這個問題的想法。 – user1488334 2013-04-26 07:39:17

回答

1

是什麼原因造成的?爲什麼一個編碼完全相同的程序會在64位機器上以64位版本免費下載內存,而在32位機器上則不是32位版本?

因爲你的代碼不正確。偶然它在32位工作,但編譯64位,具有不同的指針大小,暴露了代碼中的錯誤。

win 32位服務器和win 64位服務器有什麼區別嗎?請幫助我在兩種類型的Windows操作系統中獲得內存結構的差異。

主要區別在於指針在32位上是32位寬,在64位上是64位寬。顯然還有很多其他的區別,但從你的角度來看,它的指針大小很重要。

從遠到遠的端口從32位到64位發現的最常見的錯誤是指針截斷。假設你有代碼來投射指向整數的指針。

int i = (int) p; 

這種情況發生在運行時爲32位編譯時,但在64位上,你失去了一半的指針。當你以後回到一個指針時

int* p = (int*) i; 

你沒有得到和你一樣的指針。基本上問題在於代碼假定在Windows上4字節寬的int與指針的大小相同。該假設適用於32位,但不適用於64位。

你可能會患上這個問題,很可能還會有其他更微妙的問題。爲了解決這個問題,您需要詳細調試過程。

我認爲你正在尋找一些簡單的開關,這將使你的程序工作。沒有神奇的解決方案,因爲問題在於你的代碼。所以需要仔細調試。

相關問題