Где глобальные переменные DLL хранятся в памяти? - PullRequest
3 голосов
/ 17 августа 2011

Предположим, у вас есть приложение VB6, которое использует C ++ DLL.Они разделяют одну и ту же память (вы можете использовать указатели от одного в другом).DLL объявляется в приложении VB6 с Public Declare Function ... Lib ...

Так как же это согласуется с философией «Стек растет с одной стороны памяти, а куча с другой»?Где находится стек DLL?Выделяются ли глобальные переменные DLL при запуске приложения?Если да, то почему он выдает ошибку только при попытке запустить функцию из DLL?

Ответы [ 4 ]

4 голосов
/ 17 августа 2011

VB6 использует локальное хранилище потока для переменных уровня модуля, а не сегментов данных.Это означает, что публичные (глобальные) переменные в модуле могут иметь разные значения для разных потоков.Это не то, к чему привыкли разработчики на C / C ++.

4 голосов
/ 17 августа 2011

Глобальные переменные хранятся в сегменте данных.

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

Стек используется только для локальных переменных.

2 голосов
/ 17 августа 2011

Глобальные символы DDL будут находиться в самом образе DLL.Если DLL использует символ в качестве указателя, к которому она присоединяет некоторую динамическую память, то память будет из того, из чего происходит динамическое выделение (обычно это куча, используемая CRT).Нам нужно было бы точно увидеть, как выглядит объявление VB импорта C ++ и что делает C ++ DLL (может быть инициализация на DllMain, может быть статической областью в образе DLL, может потребоваться вызов некоторой функции Init и т. Д. И т. Д. И т. Д.).

«Стек растет с одной стороны памяти, а куча с другой», правда, возможно, на 8088 процессорах, на современных платформах такого не происходит.Стек распределяется по потокам и идет вверх, правда, но в процессе могут быть сотни стеков.Куча распределяется повсюду и растет, в основном, наугад.И типичный процесс также имеет несколько куч.

1 голос
/ 17 августа 2011

Обычно существует один стек на поток. Функция в DLL будет использовать стек текущего потока (поток, к которому был вызван).

См. Ответ Ремуса на другие ваши вопросы об управлении памятью.

...