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
Kunne problemet ikke have relation til de hukommelsesfejl, der kan forekomme, hvis man allokerer i et adresseområde og deallokerer i et andet, som fx hvis man new'er i DLL og delete'r samme adresse i applikation eller anden DLL?



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?


Hvis ikke det virker med en std::map er der ingen grund til at tro at det vil virke med en std::vector eller std::queue eller ...

Hvad skulle problemet være med std::map?

Kører dine dll'er i samme applikation?



Ja mine DLL'er kører i samme applikation og er derfor i samme memory space.

De er ligeledes kompileret med samme library som er: /MDd og /MD



Indlæg senest redigeret d. 15.11.2006 13:12 af Bruger #10448
Hvorfor siger du "Jeg ved at der et problem med at overføre std::map mellem to DLL'er"?
Det bør der ikke være nogen problemer i.

Kan du lave et komplet eksempel der viser fejlen?







Indlæg senest redigeret d. 14.11.2006 09:22 af Bruger #10448
Helt specifikt er problemet med std::map og std::set, at hvis jeg fx returnerer en reference til en std::map fra en fælles dll til min hovedapplikation, så kan jeg godt kalde de almindelige informative metoder så som size(), men så snart jeg begynder at iterere, så crasher programmet. For nærmere information om problemet, se url'en:

http://support.microsoft.com/kb/172396/en-us





Indlæg senest redigeret d. 14.11.2006 09:35 af Bruger #10448
Lyder som en Microsoft VisualC++ BUG, gad vide om der er andre compilere der har problemet.

Der står et fix på siden du linker til.
Jeg går ud fra at der er problemer med alle containere.



Det kunne det godt hvis DLL'erne kørte i forskellige applikationer, men de kører netop i samme applikation, og så bør der ikke være problemer.



Her er et yderligere link om problemstillingen.

http://caseys.kcfilms.com/2006/01/using_stl_objects_across_dll_b.php

Jeg tror det lykkes mig at få problemet løst, men nu vil jeg lige se om det er en tilfældig eller om det også virker for mine andre iteratorer.

Lykkes det også for de øvrige iteratorer vil jeg lige poste en snip, der viser løsningen på problemet og herefter lukke tråden.





Det var vidst mere et tilfælde at det rent faktisk lykkes sidst for ved de resterende iteratorer var den fløjtende ligeglad. :-(

Hvad jeg prøvede, det var at have container og iterator liggende lokalt i min forretningsdll og lave en iteratormetode, som bruger den intern iterator og returnerer objekterne fra containeren.

Iterator og container er ikke placeret på den klasse som er eksporteret, men på et niveau længere nede.

Igen fungerer det fint i debuggeren men når programmet kører udenfor debuggeren, så brager det ned.

Begge DLL'er er kompileret med lib, som er: /MDd og /MD

Fold kodeboks ind/udKode 



Herefter bliver det kaldt på følgende måde:

Fold kodeboks ind/udKode 



Nogle idéer?!

Pft.




Indlæg senest redigeret d. 15.11.2006 16:56 af Bruger #10448
<< < 12 > >>
t