我的程序中需要在DLL中进行内存的分配或realloc,并将新的内存地址返回。我的做法是这样的:
__declspec(dllexport) int dllRealloc(void **mem, int newsize)
{
    *mem = realloc(*mem, newsize);
    return *mem==NULL;
}
    *mem在EXE中已经分配好,然后调用DLL至realloc处时,出现错误,说*mem不是合法的堆上的内存块。我的另一个函数中在DLL中进行了malloc,并且将该内存的地址返回至EXE,在EXE中使用时没什么问题,但在EXE中free时,也同样发生不是合法堆上的内存块的错误。不知这是什么原因?应如何改正?谢谢!

解决方案 »

  1.   

    应该是具体运行库实现的问题吧,可能不允许你这样做。该用HeapAlloc或GlobalAlloc不知可不可以?
      

  2.   

    内存分配和释放最好在同一个模块中。(推荐的做法。)
    否则就会出现你的问题。解决办法如下:
    在dll中提供分配和释放内存的函数。
    在exe中调用这两个函数即可。
      

  3.   

    用GlobalAlloc()代替new, 用GlobalFree() 代替delete就不会出错了
        其实还有一个办法,就是把dll的Settings的C/C++选项卡的Code Generation的Use Run-time liberary改成Debug Multithreaded DLL,在Release版本中改成Multithreaded DLL,就可以直接使用new和delete了,没问题
        比较规范点的做法一般是DLL分配的内存由DLL释放。在DLL中加一个函数释放内存不是更好吗。
      

  4.   

    你这种用法是允许的,虽然不建议这么做,还要声明,调用你的接口函数的内存申请必须使用malloc or realloc在对中获得,否则就会出问题。还有就是你的写法本身存在问题,容易出现内存泄漏,因为没有考虑realloc失败的情况,正确的解法应该是:
       *mem = realloc(*mem, newsize);
    如果你这个申请内存的操作失败,mem的内存就泄漏了
        return *mem==NULL;   void *lpbuff = realloc(*mem, newsize);   if(NULL == lpbuff)
            free(mem);
        return *mem==NULL;
      

  5.   

    if(NULL == lpbuff)
            free(mem);
    *mem =lpbuff;
        return *mem==NULL;