std::vector mellem dll'er

Tags:    c++

<< < 12 > >>
Hejsa,

BAGGRUND
Jeg er kommet ind i et lidt "spøjst" problem, som ikke forekommer når jeg kører applikationen i debuggeren. Når jeg kører applikationen udenfor debuggeren så brager den ned. Den er stadig kompileret i debug mode, hvilket gør den bibeholder sine symboler - og gør mig i stand til at bruge OutputDebugString() metoden, som er den eneste måde jeg kan trace problemet på, hvilket ikke er nemt!

PROBLEMET
Jeg har en DLL som tager en reference til en std::vector, som den efterfølgende skal fylde med objekter og returnerer. Metoden som fylder min std::vector er eksponeret på DLL'en og de objekter (mine forretningsobj) ligger i samme DLL og er også eksponeret. Problemet er her at den crasher under opfyldning af vector'en!

Fold kodeboks ind/udKode 


Disse kaldes fra en anden DLL på følgende måde.

Fold kodeboks ind/udKode 


Jeg ved at der et problem med at overføre std::map mellem to DLL'er, men eksisterer det også for std::vector? Er der nogle der har oplevet samme problem og/eller har en løsning på det?


På forhånd tak.








Indlæg senest redigeret d. 13.11.2006 18:46 af Bruger #10448
12 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 1 karma
Sorter efter stemmer Sorter efter dato
Så lykkes det at få løst problemet!

Selvom begge DLL'er er kompileret med samme lib, som i dette tilfælde er /MD og /MDd, samt at begge DLL'er kører i samme memory space, så er stadig problemer med håndtering af delt hukommelse og STL.Det helt generelle problem er blevet identificeret til at der er problemer med data, der er allokeret dynamisk, mens der ikke ser ud til at være problemer med data, der er allokeret statisk.

Jeg har valgt at løse problemet på følgende måde, hvor der tages udgangspunkt i den forrige kommentar jeg har skrevet:

Fold kodeboks ind/udKode 


Det kan eventuelt vælges at placere containeren og iteratoren på klassen i stedet for at de ligger som globale variable, hvilket designmæssigt også er pænere.

Kaldet til DLL'en foregår på følgende måde:

Fold kodeboks ind/udKode 


Den mest markante ændring, der er foretaget er at der i stedet for at bruge pointere på tværs af DLL'erne nu bliver brugt referencer! og ved overførsel af data, så kopieres der data ind i et objekt, som er allokeret af modtager DLL'en. Endvidere skal man sørge for at der for ens domæne objekter er lavet en copy-constructor, som netop tages i brug ved kopiering af objekternes data (se min forrige kommentar for signaturen af denne). Herved er det ikke blot adresserne til domæne objekternes data, der bliver kopieret.

Hth




Indlæg senest redigeret d. 16.11.2006 11:08 af Bruger #10448


Nicolai Lyster Fersner, du burde have haft 5 points.

Det må du lige have tilgode...





Indlæg senest redigeret d. 16.11.2006 12:17 af Bruger #10448
<< < 12 > >>
t