2011-08-17 128 views
2

假設您有一個使用C++ DLL的VB6應用程序。它們共享相同的內存(可以使用另一箇中的指針)。該DLL在VB6應用程序中聲明爲Public Declare Function ... Lib ...存儲在內存中的DLL的全局變量在哪裏?

那麼這與「堆棧從內存的一邊增長,堆到另一邊」哲學如何匹配呢? DLL的堆棧在哪裏?應用程序啓動時分配全局DLL變量嗎?如果是這樣,爲什麼當我嘗試從DLL運行函數時,它只會給我一個錯誤?

+4

你爲什麼不給我們一個提示並告訴我們錯誤信息? – jdigital

+0

沒有錯誤。它完美的作品。我只是想知道DLL的全局變量在內存中的位置。我認爲一個進程從一個方向堆積,另一個從另一個方向堆疊 - 這使得很難說明動態加載的DLL的全局變量。 –

回答

4

VB6將thread local storage用於模塊級變量,而不是數據段。這意味着模塊中的公共(全局)變量對於不同的線程可以具有不同的值。這不是C/C++開發人員習慣的。

2

全局DDL符號將在DLL圖像本身。如果DLL使用符號作爲其附加動態內存的指針,那麼內存將來自動態分配的內容(通常是CRT使用的堆)。我們需要確切地知道C++導入的VB聲明的外觀和C++ DLL的功能(可能在DllMain上初始化,可能是DLL映像中的靜態區域,可能需要調用某些Init函數等等) 。

可能在8088處理器上,「堆棧從內存的一邊增長,從另一邊堆積」是真實的,在現代平臺上不會出現這種情況。堆棧被分配到每個線程並向上,真實的,但是在一個進程中可能有數百個堆棧。堆被分配到所有地方並且基本隨機地增長。一個典型的過程也有幾個堆。

4

全局變量存儲在數據段中。

http://en.wikipedia.org/wiki/Data_segment

堆棧只用於局部變量。

+0

是的,數據段是OP丟失的內存部分。當地居民生活在堆棧中,動態分配的對象存在於堆中,但靜態/全局存在於它們所屬的exe或dll的數據段中。 – BrendanMcK

1

每個線程通常有一個堆棧。 DLL中的函數將使用當前線程(被調用的線程)的堆棧。

有關內存管理的其他問題,請參閱Remus的回答。

相關問題