Передача ссылки на вектор STL через границу dll

У меня есть хорошая библиотека для управления файлами, которая должна возвращать определенные списки строк. Поскольку единственным кодом, с которым я когда-либо буду использовать его, будет C ++ (и Java, но использующий C ++ через JNI), я решил использовать vector из стандартных библиотек. Библиотечные функции выглядят примерно так (где FILE_MANAGER_EXPORT - это определяемое платформой требование экспорта):

extern "C" FILE_MANAGER_EXPORT void get_all_files(vector<string> &files)
{
    files.clear();
    for (vector<file_struct>::iterator i = file_structs.begin(); i != file_structs.end(); ++i)
    {
        files.push_back(i->full_path);
    }
}

Причиной, по которой я использовал вектор в качестве ссылки вместо возвращаемого значения, является попытка сохранить распределение памяти в здравом уме, и потому что windows был действительно недоволен тем, что у меня есть extern «C» вокруг возвращаемого типа c ++ (кто знает, почему, я понимаю, что все внешние » C "предотвращает искажение имени в компиляторе). В любом случае, код для использования этого с другим c ++, как правило, выглядит следующим образом:

#if defined _WIN32
    #include <Windows.h>
    #define GET_METHOD GetProcAddress
    #define OPEN_LIBRARY(X) LoadLibrary((LPCSTR)X)
    #define LIBRARY_POINTER_TYPE HMODULE
    #define CLOSE_LIBRARY FreeLibrary
#else
    #include <dlfcn.h>
    #define GET_METHOD dlsym
    #define OPEN_LIBRARY(X) dlopen(X, RTLD_NOW)
    #define LIBRARY_POINTER_TYPE void*
    #define CLOSE_LIBRARY dlclose
#endif

typedef void (*GetAllFilesType)(vector<string> &files);

int main(int argc, char **argv)
{
    LIBRARY_POINTER_TYPE manager = LOAD_LIBRARY("library.dll"); //Just an example, actual name is platform-defined too
    GetAllFilesType get_all_files_pointer = (GetAllFilesType) GET_METHOD(manager, "get_all_files");
    vector<string> files;
    (*get_all_files_pointer)(files);

    // ... Do something with files ...

    return 0;
}

Библиотека компилируется через cmake с использованием add_library (file_manager SHARED file_manager.cpp). Программа скомпилирована в отдельный проект cmake с использованием add_executable (file_manager_command_wrapper command_wrapper.cpp). Для них не указаны флаги компиляции, только эти команды.

Теперь программа прекрасно работает как в Mac, так и в Linux. Проблема в окнах. При запуске я получаю эту ошибку:

Ошибка отладки!

...

Выражение: _pFirstBlock == _pHead

Это, как я выяснил и понимаю, из-за отдельных кучи памяти между исполняемыми файлами и загруженными библиотеками. Я считаю, что это происходит, когда память выделяется в одной куче и освобождается в другой. Проблема в том, что я не могу понять, что происходит не так. Память выделяется в исполняемом файле и передается как ссылка на функцию dll, значения добавляются через ссылку, а затем они обрабатываются и, наконец, освобождаются обратно в исполняемый файл.

Я бы раскрыл больше кода, если бы мог, но интеллектуальная собственность в моей компании заявляет, что не могу, поэтому весь приведенный выше код является лишь примерами.

Кто-нибудь с большим знанием предмета может помочь мне понять эту ошибку и указать мне правильное направление для отладки и исправления? К сожалению, я не могу использовать Windows-машину для отладки, так как я разрабатываю на Linux, а затем фиксирую любые изменения на сервере Gerrit, который запускает сборки и тестирует через jenkins. У меня есть доступ к консоли вывода при компиляции и тестировании.

Я рассматривал возможность использования не-stl-типов, копируя вектор из c ++ в char **, но распределение памяти было кошмаром, и я изо всех сил пытался заставить его работать хорошо на Linux, не говоря уже о окнах, и это ужасно, несколько куч.

РЕДАКТИРОВАТЬ: он определенно падает, как только файл вектора выходит из области видимости. Моя текущая мысль состоит в том, что строки, помещенные в вектор, размещаются в куче DLL и освобождаются в исполняемой куче. Если это так, может кто-нибудь просветить меня, чтобы найти лучшее решение?