这可能是由于在 MFC 0f c++ 中我 运行 程序时堆错误的损坏
This may be due to a corruption of the heap error when i run program in MFC 0f c++
当我 运行 程序启动时,它会显示如图所示的错误。
enter image description here
当我点击继续时,它会显示如图所示的错误
enter image description here
这是我写的代码结构。
int nSites = 0;
int nTasks = 0;
int nThreads = 0;
CCriticalSection cs;
BOOL bUpdateList=false;
UINT VisitSite(LPVOID pParam){
int nTask = 0;
CInternetSession session;
session.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT,5000);
CHttpConnection *pConnection = NULL;
CHttpFile *pFile1 = NULL;
char *buffer = new char[10240];
UINT nBytesRead = 0;
while(nTasks>0){
nTask = -1;
cs.Lock();
for(int t=0;t<nSites;t++){
if(!bAssigned[t]){
bAssigned[t]=true;
nTask=t;
t=nSites;
}
}
cs.Unlock();
if(nTask == -1){
cs.Lock();
nThreads--;
cs.Unlock();
return 0;
}
try
{
pConnection = session.GetHttpConnection(sAddress[nTask], 80, (_T("")), (_T("")));
pFile1 = pConnection->OpenRequest((_T("GET")), (_T("/")));
pFile1->SendRequest();
nBytesRead = pFile1->Read(buffer, 10240);
buffer[nBytesRead] = (_T('[=11=]'));
//ถ้าหากว่า สามารถติดต่อได้ ที่ port 80จริง ให้พิมพ์ข้อความว่า IP Address น้ีเป็น Web server
if (pConnection != NULL)
{
cs.Lock();
bUpdateList=true;
bIsWebServer[nTask]=true;
cs.Unlock();
}
cs.Lock();
bFinished[nTask]=true;
nTasks--;
nThreads--;
cs.Unlock();
if(pFile1) delete pFile1;
if(pConnection) delete pConnection;
delete [] buffer;
if (buffer != NULL) {
HeapFree(GetProcessHeap(), 0, buffer);
}
if (pFile1 != NULL) {
HeapFree(GetProcessHeap(), 0, pFile1);
}
if (pConnection != NULL) {
HeapFree(GetProcessHeap(), 0, pConnection);
}
//return 0;
}
catch (CInternetException* ie )
{
ie->Delete();
cs.Lock();
nTasks--;
bUpdateList=true;
bFinished[nTask]=true;
bIsWebServer[nTask]=false;
nThreads--;
cs.Unlock();
}
}
cs.Lock();
nThreads--;
cs.Unlock();
session.Close();
return 0;
}
因为我认为它来自 *ie 但不确定我是否正确编写了结构,请检查。
看看这个
char *buffer = new char[10240];
...
delete [] buffer;
if (buffer != NULL) {
HeapFree(GetProcessHeap(), 0, buffer);
}
您不需要使用 delete[]
和 HeapFree
。因为您使用 new[]
来分配 buffer
,所以您应该使用 delete[]
来释放它。删除对 HeapFree
.
的调用
你和pFile1
和pConnection
有同样的问题,使用delete
不要使用HeapFree
。
另一个变化
if(pFile1) delete pFile1;
if(pConnection) delete pConnection;
可以简化为
delete pFile1;
delete pConnection;
删除NULL指针不是错误。删除NULL指针没有效果,所以删除前不需要检测指针是否为NULL
但是就像 Alan Birtles 所说的那样,您真的应该在尝试使用它之前测试 pConnection
是否为 NULL。
当我 运行 程序启动时,它会显示如图所示的错误。 enter image description here 当我点击继续时,它会显示如图所示的错误 enter image description here 这是我写的代码结构。
int nSites = 0;
int nTasks = 0;
int nThreads = 0;
CCriticalSection cs;
BOOL bUpdateList=false;
UINT VisitSite(LPVOID pParam){
int nTask = 0;
CInternetSession session;
session.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT,5000);
CHttpConnection *pConnection = NULL;
CHttpFile *pFile1 = NULL;
char *buffer = new char[10240];
UINT nBytesRead = 0;
while(nTasks>0){
nTask = -1;
cs.Lock();
for(int t=0;t<nSites;t++){
if(!bAssigned[t]){
bAssigned[t]=true;
nTask=t;
t=nSites;
}
}
cs.Unlock();
if(nTask == -1){
cs.Lock();
nThreads--;
cs.Unlock();
return 0;
}
try
{
pConnection = session.GetHttpConnection(sAddress[nTask], 80, (_T("")), (_T("")));
pFile1 = pConnection->OpenRequest((_T("GET")), (_T("/")));
pFile1->SendRequest();
nBytesRead = pFile1->Read(buffer, 10240);
buffer[nBytesRead] = (_T('[=11=]'));
//ถ้าหากว่า สามารถติดต่อได้ ที่ port 80จริง ให้พิมพ์ข้อความว่า IP Address น้ีเป็น Web server
if (pConnection != NULL)
{
cs.Lock();
bUpdateList=true;
bIsWebServer[nTask]=true;
cs.Unlock();
}
cs.Lock();
bFinished[nTask]=true;
nTasks--;
nThreads--;
cs.Unlock();
if(pFile1) delete pFile1;
if(pConnection) delete pConnection;
delete [] buffer;
if (buffer != NULL) {
HeapFree(GetProcessHeap(), 0, buffer);
}
if (pFile1 != NULL) {
HeapFree(GetProcessHeap(), 0, pFile1);
}
if (pConnection != NULL) {
HeapFree(GetProcessHeap(), 0, pConnection);
}
//return 0;
}
catch (CInternetException* ie )
{
ie->Delete();
cs.Lock();
nTasks--;
bUpdateList=true;
bFinished[nTask]=true;
bIsWebServer[nTask]=false;
nThreads--;
cs.Unlock();
}
}
cs.Lock();
nThreads--;
cs.Unlock();
session.Close();
return 0;
}
因为我认为它来自 *ie 但不确定我是否正确编写了结构,请检查。
看看这个
char *buffer = new char[10240];
...
delete [] buffer;
if (buffer != NULL) {
HeapFree(GetProcessHeap(), 0, buffer);
}
您不需要使用 delete[]
和 HeapFree
。因为您使用 new[]
来分配 buffer
,所以您应该使用 delete[]
来释放它。删除对 HeapFree
.
你和pFile1
和pConnection
有同样的问题,使用delete
不要使用HeapFree
。
另一个变化
if(pFile1) delete pFile1;
if(pConnection) delete pConnection;
可以简化为
delete pFile1;
delete pConnection;
删除NULL指针不是错误。删除NULL指针没有效果,所以删除前不需要检测指针是否为NULL
但是就像 Alan Birtles 所说的那样,您真的应该在尝试使用它之前测试 pConnection
是否为 NULL。