在C ++动态库和主C程序之间共享分配的内存缓冲区

时间:2019-03-02 08:18:51

标签: c++ c memory-management dynamic-library socketserver

要使用基于C的套接字服务器框架,我们需要在基于C的程序的套接字服务器线程和基于C ++的DLL之间传输数据。 操作系统MacO。

在DLL中,一切正常,我们能够管理OCR核心和数据库。 在套接字服务器内部,一切正常,并且经过几年的测试,ESP框架已经成熟 embedthis.com/esp/

借助Stackoverflow社区,我们开发了工作解决方案。 现在正在工作的用于将分配的内存缓冲区从DLL传输到主程序的代码是:

//in library header
typedef
    struct pageRecord{
        char *data;
    }pageRec;

// in library function
extern "C"{
EXPORT
    pageRec helloVarStr(void) {
        //c++ content
        string stData="www ....";
        pageRec rec;
        rec.data=(char*)calloc(stData.size()+1,1);
        memcpy(rec.data,&stData[0],stData.size());
        return rec;
    }
}
//in socket server thread
       pageRec c=helloVarStr();
       printf("%s",c.data); 

此代码工作正常,并在结构内部使用了指针。 但是,如果我们尝试仅使用指针本身,则会在C程序中出现内存错误

此代码执行上升内存错误:

 EXPORT
    const char* helloVarStr() {
        //c++ content
        char *str=(char*)calloc(stData.size()+1, 1);
        string stData="www....";
        memcpy(str,(char*)&stData[0],stData.size());
        return str;
    }
//in C language ESP socket server 
       char *report=helloVarStr(&report);  
       printf("%s",report);  //!// memory error

我们不能在分配的缓冲区上使用直接指针作为从库函数返回的函数。 静态和动态链接都存在此问题。

为什么我们可以在结构体中使用指针作为库函数返回,但不能使用指针本身呢? 这是否意味着DLL使用了我们无法直接访问的另一个内存地址空间?

此解决方案需要6Tb,每秒1个请求的套接字服务器站点。

0 个答案:

没有答案