一个关于动态链接库中内存释放的问题
各位高手:
我有一个关于内存释放的问题感到很棘手,它是这样的:
我有个工作空间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]的地址,它们是一样的,可就是报错,退出,不知道怎么解决,
希望高手指点.