DLL中内存分配再去释放的问题,提示:其原因可能是堆被损坏,这也说明demo.exe中或它所加载的任何 DLL 中有bug。

时间:2021-02-20 02:23:37
出错的 函数如下,为什么在函数里申请空间了再释放就出问题了呢?这个函数是属于我写的一个动态库中的。在外通过demo函数去进行功能测试。(刚才试验了下,在申请完毕后立刻释放却没有问题,这个是为什啊,难不成是因为整个过程中调用的函数改变了指针指向的空间?不至于啊,- -。真心求助)

int CASYoutubeURLParser::FindURL(void)
 {
char* cpBeginLocation = m_cDownloadURL;
char* cpMidLocation = NULL;
char* cpEndLocation = NULL;
char* beginFindExt = NULL;
char* endFindExt = NULL;
char* tempBuff = NULL;
char* beginKey = "http";
char* midKey = "type=video";
char* beginExtKey = "quality=";
char* endExtKey = "&";
int count = 0;/*用于统计影片的数量*/

        //tempBuff =new char[256];
tempBuff = (char*) malloc (256*sizeof(char));

if( tempBuff != NULL)
{
memset(tempBuff, 0 , 256);
}
else
{
return -1;
}
do
{
cpBeginLocation = strstr(cpBeginLocation, beginKey);
if(cpBeginLocation == NULL){
break;
}

cpMidLocation = strstr( cpBeginLocation , midKey);
if(cpMidLocation == NULL){
break;
}

cpEndLocation = cpMidLocation + strlen(midKey);
int i=0;
do{
++cpEndLocation;
if( *cpEndLocation == ';' || *cpEndLocation == '&')
{
break;
}
++i;
}while(i<20);

/*找不到关键字就中断搜索*/
if(i == 20)
{
break;
}
/*
**    添加信息
** //获取URL信息
*/
strncpy( tempBuff, cpBeginLocation, cpEndLocation- cpBeginLocation);
tempBuff[cpEndLocation- cpBeginLocation] = '\0';
chr2wch( tempBuff, m_szActualDownloadURL[count] );
std::wcout<<m_szActualDownloadURL[count]<<std::endl;

/*获取类型*/
//strncpy( m_szActualDownloadFileExt[count], cpMidLocation+ strlen(midKey) + 1, cpEndLocation- strlen(midKey) -1);
//
///*保存影片的质量信息 如hd720等*/
//beginFindExt = strstr( cpBeginLocation,  beginExtKey) + strlen(beginExtKey);
//endFindExt = strstr( beginFindExt, endExtKey );
//strncpy( m_szActualDownloadQuality[count], beginFindExt, endFindExt - beginFindExt);

++count;/*统计总共的影片数量*/
cpBeginLocation = cpEndLocation;
}while(cpBeginLocation != '\0');
/*保存数量*/
m_nActualDownloadVideoCount = count;
if( tempBuff != NULL )
{
//delete[] tempBuff;
free(tempBuff);
}

return 0;
 }

函数中中调用的函数如下
void CASYoutubeURLParser::chr2wch( char* buffer, ASChar* wBuf)
{
size_t len = strlen(buffer);
size_t wlen = MultiByteToWideChar(CP_ACP, 0, (const char*)buffer, int(len), NULL, 0);
MultiByteToWideChar(CP_ACP, 0, (const char*)buffer, int(len), wBuf, int(wlen));
}
两处的反汇编结果如下:
               tempBuff = (char*) malloc (256*sizeof(char));
10004F65  mov         esi,esp 
10004F67  push        100h 
10004F6C  call        dword ptr [__imp__malloc (10007150h)] 
10004F72  add         esp,4 
10004F75  cmp         esi,esp 
10004F77  call        _RTC_CheckEsp (10005162h) 
10004F7C  mov         dword ptr [tempBuff],eax 

//delete[] tempBuff;
free(tempBuff);
100050C3  mov         esi,esp 
100050C5  mov         eax,dword ptr [tempBuff] 
100050C8  push        eax  
100050C9  call        dword ptr [__imp__free (10007160h)] 
100050CF  add         esp,4 
100050D2  cmp         esi,esp 
100050D4  call        _RTC_CheckEsp (10005162h) 

15 个解决方案

#1


顺便问下,关于DLL编程有什么好的资料推荐的没?谢谢了。

#2


- -继续求助。

#3


= =继续求助,没有人看到么?

#4


这种提示应该是指针被带出本工程项目之外了吧,楼主检查一下吧

#5


tempBuff[cpEndLocation- cpBeginLocation] = '\0';
chr2wch( tempBuff, m_szActualDownloadURL[count] );

看看是否越界了

#6


引用 5 楼 ouyh12345 的回复:
tempBuff[cpEndLocation- cpBeginLocation] = '\0';
chr2wch( tempBuff, m_szActualDownloadURL[count] );

看看是否越界了

没有越界的。

#7


引用 4 楼 kemee 的回复:
这种提示应该是指针被带出本工程项目之外了吧,楼主检查一下吧

请问下,如果我在一个测试工程中调用了这个DLL,DLL有包含这个函数的类,在测试工程的main中new一个对象是开辟在DLL的堆中,还是开辟在测试工程的堆中的呀?还有如果是在main的栈中开辟一个对象,又是怎样的一个分配过程呢?

#8


who new who delete...

#9


引用 8 楼 chengbar 的回复:
who new who delete...

可是这个是在同一个函数中的new 和delete 啊,为什么会出错呢。
这个who new who delete。有点犯浑了,如果在main中调用DLL中某个类中的函数,而这个函数中又恰恰有动态内存的分配。这个到底是在DLL管理的堆中分配的还是main.exe中的啊?

#10


- -!我滴汗。找到问题了,堆被破坏掉了,越界的问题。神啊。
散分了,来人啊。。

#11


响应楼主号召,路过接分~

#12


正想说越界,就看见LZ散分了

#13


引用 4 楼 kemee 的回复:
这种提示应该是指针被带出本工程项目之外了吧,楼主检查一下吧

strncpy( tempBuff, cpBeginLocation, cpEndLocation- cpBeginLocation);
越界点在这儿。- -。

#14


遇到同样问题,求LZ详细解答

#15


引用 14 楼 iamvcc 的回复:
遇到同样问题,求LZ详细解答

  我写的一个函数里,指针用得太频繁了,但是对于指针操作后所产生的情况没有进行具体的判断,只进行了个别情况的判断,后来是一步一步的进行调试找出问题的,一个用指针算偏移量的时候,偏移量大于要操作的存储空间位数,造成了对于堆空间的破坏,以至于,后期再调用new在堆上创建空间的时候,崩掉了。
这个只能自己慢慢调试了,查看结果是不是预期的。或者在自己觉得可能出错的地方进行 new 的操作,把出现崩溃的位置一点一点缩小范围,最后进行扫雷。
  嘿嘿,这就是一点心得。

#1


顺便问下,关于DLL编程有什么好的资料推荐的没?谢谢了。

#2


- -继续求助。

#3


= =继续求助,没有人看到么?

#4


这种提示应该是指针被带出本工程项目之外了吧,楼主检查一下吧

#5


tempBuff[cpEndLocation- cpBeginLocation] = '\0';
chr2wch( tempBuff, m_szActualDownloadURL[count] );

看看是否越界了

#6


引用 5 楼 ouyh12345 的回复:
tempBuff[cpEndLocation- cpBeginLocation] = '\0';
chr2wch( tempBuff, m_szActualDownloadURL[count] );

看看是否越界了

没有越界的。

#7


引用 4 楼 kemee 的回复:
这种提示应该是指针被带出本工程项目之外了吧,楼主检查一下吧

请问下,如果我在一个测试工程中调用了这个DLL,DLL有包含这个函数的类,在测试工程的main中new一个对象是开辟在DLL的堆中,还是开辟在测试工程的堆中的呀?还有如果是在main的栈中开辟一个对象,又是怎样的一个分配过程呢?

#8


who new who delete...

#9


引用 8 楼 chengbar 的回复:
who new who delete...

可是这个是在同一个函数中的new 和delete 啊,为什么会出错呢。
这个who new who delete。有点犯浑了,如果在main中调用DLL中某个类中的函数,而这个函数中又恰恰有动态内存的分配。这个到底是在DLL管理的堆中分配的还是main.exe中的啊?

#10


- -!我滴汗。找到问题了,堆被破坏掉了,越界的问题。神啊。
散分了,来人啊。。

#11


响应楼主号召,路过接分~

#12


正想说越界,就看见LZ散分了

#13


引用 4 楼 kemee 的回复:
这种提示应该是指针被带出本工程项目之外了吧,楼主检查一下吧

strncpy( tempBuff, cpBeginLocation, cpEndLocation- cpBeginLocation);
越界点在这儿。- -。

#14


遇到同样问题,求LZ详细解答

#15


引用 14 楼 iamvcc 的回复:
遇到同样问题,求LZ详细解答

  我写的一个函数里,指针用得太频繁了,但是对于指针操作后所产生的情况没有进行具体的判断,只进行了个别情况的判断,后来是一步一步的进行调试找出问题的,一个用指针算偏移量的时候,偏移量大于要操作的存储空间位数,造成了对于堆空间的破坏,以至于,后期再调用new在堆上创建空间的时候,崩掉了。
这个只能自己慢慢调试了,查看结果是不是预期的。或者在自己觉得可能出错的地方进行 new 的操作,把出现崩溃的位置一点一点缩小范围,最后进行扫雷。
  嘿嘿,这就是一点心得。