[Lazarus] Bug on library project while accessing string
Sven Barth
pascaldragon at googlemail.com
Sun Jan 27 12:03:09 CET 2013
On 24.01.2013 06:57, Darmawan Sugiarto wrote:
> hello guys, I got some bug on library project. When I uses Lazarus
> 0.9.28.2 I write this code and work well, then I recompile it use
> Lazarus 1.0.2 and 1.0.4 and got this error....
>
> Project project_test raised exception class 'External: SIGEGV'.
> At address 7C91B1FA
>
> I have 2 project
> first project is library project...
> Here is the code for first project
>
> function test(_str:string):string; cdecl; export;
Short answer: Don't use strings as arguments or result values if you
export a function from a library. Use PChar instead.
Long answer: Strings are so called "managed types". They involve
compiler magic which allocates the memory and frees it also if the
string is no longer needed. If you now have a library (let's assume both
are written with FPC) then you have two heap managers: one in the
program and one in the library. Those two don't know about each other
and thus if e.g. the program tries to free the string that your library
function returned that it will break, because it assumes the memory was
allocated by itself.
This can be solved in two (or in theory three) ways:
1. use PChar and manage the memory for your strings yourself (e.g. if
your library returns a PChar you need to have an additional exported
function with which you can tell your library to free the PChar's memory
again). Additional positive effect: the library can be written in
something else than FPC or the library can be used by a program not
written with FPC (other languages don't know FPC's String type).
[plattform specific note: on Windows (and there only!) you can use the
WideString type, because that type is managed by Windows]
2. use a common heap manager. If the heap manager is shared between the
program and the library than you can freely pass memory between both
parts and free it in the other part. For this you can use the unit
"cmem" which will use the C library's heap manager (works on Unix
systems, but should work on Windows ones as well). Note: the unit should
be the first unit used by your main file (the program file and the
library file)
(3. dynamic runtime packages allow you to freely pass strings (and also
object instances, etc.) between the program file and the package. As
Free Pascal does not support them yet this is only a theoretical option)
Additional note: Don't start a new question by answering to an existing
mail, because than your answer might not be seen by other mailing list
readers, because they might ignore the thread you posted to (as seems to
have happened...)
Regards,
Sven
More information about the Lazarus
mailing list