在Dll中通过new申请的内存,在主程序中直接释放时出错;但如果主程序是Release版本,不会报错;Debug版本才报错。如果通过调用Dll开放的内存释放接口,可以正常释放内存。/////////////////////////////////////////////////////////////////////////////////////
Dll程序:
EXPORT int AllocBuf( char * &strBuf )
{
 strBuf = new char[100] ;
 if( strBuf != NULL )
  return 1 ;
 else
  return 0 ;
}EXPORT void FreeBuf( char *& strBuf )
{
 delete strBuf ;
}/////////////////////////////////////////////////////////////////////////////////////
主程序:
 char *  buf1  ;
 char * buf2 ;
 AllocBuf( buf1 ) ;
 AllocBuf( buf2 ) ;
 FreeBuf( buf1 ) ;  // 正确
 delete buf2 ;      //Debug版程序运行异常,Release版本运行正常
}
//////////////////////////////////////////////////////////////////////////////////
将new 修改为 malloc,仍存在原有问题////////////////////////////////////////////////////////////////////////////////////////
//Dll程序
EXPORT int AllocBuf( char * &strBuf )
{
 strBuf = (char * ) malloc( 100 )  ;
// strBuf = new char[100] ;
 if( strBuf != NULL )
  return 1 ;
 else
  return 0 ;
}EXPORT void FreeBuf( char *& strBuf )
{
 delete strBuf ;
}/////////////////////////////////////////////////////////////////////////////////
//主程序
 char * buf1 =NULL ;
 char * buf2 = NULL ;
 int ret1 = AllocBuf( buf1 ) ;
 int ret2 = AllocBuf( buf2 ) ;
 FreeBuf( buf1 ) ;//正常
 delete buf2 ;//Debug版本程序异常
///////////////////////////////////////////////////////////////////////////////////////////

解决方案 »

  1.   

    project setting->c/c++ ->code generation,use run-time library中选中
    debug multithreaded DLL。注意DLL程序和主程序都要这样设置。
      

  2.   

    程序中,单个地址空间是由一个可执行模块和若干个D L L模块组成的。
    这些模块中,有些可以链接到静态版本的C / C + +运行期库,有些可以链接到一个D L L
    版本的C / C + +运行期库,而有些模块(如果不是用C / C + +编写的话)则根本不需要
    C / C + +运行期库。如果E X E和D L L都链接到D L L的C / C + +运行期库,那么上面的代码将能够很好地运行。但是,如果两个模块中的一个或者两个都链接到静态C / C + +运行期库,那么对delete函数的调用就会失败!建议还是使用new/delete (malloc/free)来成对使用!不要用杂!看看你的DEBUG DLL 是否和 DEBUG APP一起使用!DEBUG 和RELEASE的内存分配方式不同!!
      

  3.   

    一般的原则是“谁分配谁释放”,因此最好不要让 DLL 分配的内存块在 EXE 释放。你可以让 EXE 分配内存块后把指针传给 DLL 使用。具体的错误是因为 DEBUG 版本的 EXE 模块在释放内存块前会访问内存块头或尾的信息检查该内存块,如果该内存块不是由 EXE 分配的,可能访问标志出错或保存的信息不匹配产生 Assert failed
      

  4.   

    to: webber84(***闭关修炼中***)
    如果主程序不是C语言代码,那又该怎么做呢?
      

  5.   

    EXPORT void FreeBuf( char *& strBuf )
    {
     delete strBuf ;
    }
    为EXPORT void FreeBuf( char *& strBuf )
    {
     delete []strBuf ;
    }delete []strBuf2 ;
    为delete []strBuf2 ;