我的程序中需要在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时,也同样发生不是合法堆上的内存块的错误。不知这是什么原因?应如何改正?谢谢!
__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时,也同样发生不是合法堆上的内存块的错误。不知这是什么原因?应如何改正?谢谢!
解决方案 »
- 怎样实现用户编辑框中内容与ACCESS中的某一内容比较?
- 消息捕获
- Popup菜单挂接的问题
- ado 向表中插入数据的问题
- 怎么锁住一个窗口的大小?
- 用InstallShield做安装程序,怎么做出“开始”菜单中的"UnInstall"?
- 各位大侠请了,关于ActiveX控件的问题。
- 紧急求救!!!!为什么TRACE宏用不起啊!
- 问个问题:CPropertySheet和CTabCtrl生成的属性表有什么区别?另外属性表的原理是什么?是不是若干个控件都在一个对话框上,然后点击某项则显示一部分控件并隐藏其余的控件,是这样的吗?
- 请大家给写个函数 IsIPRight(char* ip),判断ip是否为一个合法的IP地址?
- 用_beginthread()创建一个挂起的线程后,该如何启动它?
- vc 对系统的最低要求是什么?(包括硬件)
否则就会出现你的问题。解决办法如下:
在dll中提供分配和释放内存的函数。
在exe中调用这两个函数即可。
其实还有一个办法,就是把dll的Settings的C/C++选项卡的Code Generation的Use Run-time liberary改成Debug Multithreaded DLL,在Release版本中改成Multithreaded DLL,就可以直接使用new和delete了,没问题
比较规范点的做法一般是DLL分配的内存由DLL释放。在DLL中加一个函数释放内存不是更好吗。
*mem = realloc(*mem, newsize);
如果你这个申请内存的操作失败,mem的内存就泄漏了
return *mem==NULL; void *lpbuff = realloc(*mem, newsize); if(NULL == lpbuff)
free(mem);
return *mem==NULL;
free(mem);
*mem =lpbuff;
return *mem==NULL;