在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版本程序异常
///////////////////////////////////////////////////////////////////////////////////////////
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版本程序异常
///////////////////////////////////////////////////////////////////////////////////////////
debug multithreaded DLL。注意DLL程序和主程序都要这样设置。
这些模块中,有些可以链接到静态版本的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的内存分配方式不同!!
如果主程序不是C语言代码,那又该怎么做呢?
{
delete strBuf ;
}
为EXPORT void FreeBuf( char *& strBuf )
{
delete []strBuf ;
}delete []strBuf2 ;
为delete []strBuf2 ;