一个关于动态链接库中内存释放的问题

popy007 2005-06-14 01:34:12

各位高手:

我有一个关于内存释放的问题感到很棘手,它是这样的:


我有个工作空间Gfx_Engine_Space.dsw,它下面有三个工程

MobileTool.dsp
GfxEngine.dsp
GfxEngineTest.dsp

MobileTool.dsp产生一个MobileToolExp.dll
GfxEngine.dsp产生一个GfxEngineExp.dll,它用到了MobileToolExp.dll
而GfxEngineTest产生对GfxEngineExp.dll的一个测试exe


在MobileToolExp.dll中有两个函数是这样的:
BOOL MemBmp_Init(void **pp)
{ try{*p = new int;}
catch(...){return FALSE;}
return TRUE;
}
BOOL MemBmp_Release(void *p)
{ if(!p) return FALSE;
delete ((int *)p);
return TRUE;
}

在GfxEngineExp.dll有两个函数调用了上面dll的两个函数:
static void *buf[64] = {NULL}; //一个全局缓冲
BOOL Readin()
{
... // 加载MobileToolExp.dll
MemBmp_Init(&buf[0]); // 用下标0简单表示
if( !buf[0] ) return FALSE;
}
void Release()
{
MemBmp_Release( buf[0] );
}

在GfxEngineTest.exe中测试如下:

... // 加载GfxEngineExp.dll
Readin();
Release(); // 异常报错!然后退出!

这时候再Release()执行的时候系统异常,报错退出.如果我
把BOOL Readin()定义成
BOOL Readin()
{
... // 加载MobileToolExp.dll
MemBmp_Init(&buf[0]); // 用下标0简单表示
if( !buf[0] ) return FALSE;
MemBmp_Release( buf[0] );
return TRUE;
}
也就是申请完内存马上释放,然后在GfxEngineTest.exe中只执行Readin()就没有问题了.
所以我觉得是在来回调用dll的时候出错的,但是运行原来的代码时在new之后打印了buf[0]的地址,在
delete之前也打印了buf[0]的地址,它们是一样的,可就是报错,退出,不知道怎么解决,
希望高手指点.
...全文
312 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
柯本 2005-06-14
  • 打赏
  • 举报
回复
感觉没问题,会不会是dll函数定义的问题(如call 方式:__stdcall/__cdecll)
老夏Max 2005-06-14
  • 打赏
  • 举报
回复
如果可以的话将所有源代码发到:vcleaner@sina.com
我帮你调试调试!

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧