C wrappers for Haskell foreign exports don't have finalizers (causes memory leak).
For each foreign export RTS creates a static C wrapper, which is initialized on DLL_PROCESS_ATTACH, but it has no finalizer/destructor to be called during DLL_PROCESS_DETACH. So it will stay alive till the program termination. That's why if one uses a Haskell DLL in their C/C++ project, **consumed memory is not fully released after freeing the library**.
[[br]][[br]]
There are four files attached to this ticket.
- **HaskellExports.hs** contains exact one foreign export function;
- **CWrapper.cpp** is supposed to contain wrappers to the Haskell functions, described in HaskellExports.hs, but it doesn't because they make no difference;
- **main.cpp**: here in an endless loop the DLL (built with the help of the script below) is loaded and freed at once. Launched program is crashed in a while (because it runs out of memory);
- **build.sh** is a script for building the library.
[[br]] The main program was built with MSVC 2015.
Trac metadata
| Trac field | Value |
|---|---|
| Version | 8.0.1 |
| Type | Bug |
| TypeOfFailure | OtherFailure |
| Priority | normal |
| Resolution | Unresolved |
| Component | Compiler (FFI) |
| Test case | |
| Differential revisions | |
| BlockedBy | |
| Related | |
| Blocking | |
| CC | |
| Operating system | |
| Architecture |