c ++ - Hvor er globale variabler af en DLL gemt i hukommelsen?

Indlæg af Hanne Mølgaard Plasc

Problem



Antag, at du har en VB6 app, der bruger en C ++ DLL. De deler samme hukommelse (du kan bruge peger fra den ene til den anden). DLL'en er erklæret i VB6-appen med Public Declare Function ... Lib ...


Så hvordan passer dette med 'Stacken vokser fra den ene side af hukommelsen, heap fra den anden' filosofi? Hvor er stakken af ​​DLL'en? Er der tildelt globale DLL-variabler, når applikationen er startet? Hvis ja, hvorfor giver det mig kun en fejl, når jeg forsøger at køre en funktion fra DLL'en?

Bedste reference


VB6 bruger trådløst lager til modulniveauvariabler, ikke datasegmenter. Hvad dette betyder er, at offentlige (globale) variabler i et modul kan have forskellige værdier pr. Forskellige tråde. Det er ikke, hvad en C/C ++-udvikler er vant til. [2]

Andre referencer 1


Globale variabler lagres i datasegmentet.


http://en.wikipedia.org/wiki/Data\_segment[3]


Stakken bruges kun til lokale variabler.

Andre referencer 2


Globale DDL-symboler vil være i selve DLL-billedet. Hvis DLL'en bruger symbolet som en peger, som det tillægger en dynamisk hukommelse, vil hukommelsen være fra, hvad den dynamiske allokering er fra (typisk den højde, der anvendes af CRT). Vi skal se præcis, hvordan VB-erklæringen for C ++-importen ligner, og hvad C ++ DLL'en gør (kunne initialiseres på DllMain, kunne være en statisk region i DLL-billedet, kunne kræve opkald til nogle Init-funktione osv. Osv. Osv.) .


'Stak vokser fra den ene side af hukommelsen, bunke fra den anden' var sandt måske på 8088 processorer, der sker ikke sådan noget på moderne platforme. Stack bliver tildelt per tråd og går opad, sandt, men der kunne være hundredvis af stabler i en proces. Heap bliver allokeret overalt og vokser, i det væsentlige tilfældigt. Og en typisk proces har også flere dynger i den.

Andre referencer 3


Der er typisk en stak pr. Tråd. Funktionen i DLL'en vil bruge stakken af ​​den aktuelle tråd (den tråd, der er påkaldt).


Se Remuss svar på dine andre spørgsmål om hukommelsesstyring.