gpt4 book ai didi

c++ - (Visual C++) 删除指针后动态分配内存不是有效指针

转载 作者:太空宇宙 更新时间:2023-11-04 06:40:35 26 4
gpt4 key购买 nike

我有一个程序,当我单击“下载”按钮时,程序会创建一个新线程来下载网页并将其存储在动态分配的 char* 变量中。

但是现在我点击“下载”,程序显示如下信息:

---------------------------
Microsoft Visual C++ Debug Library
---------------------------
Debug Assertion Failed!

Program: d:\dev\debug\test.exe
File: dbgheap.c
Line: 1279

Expression: _CrtIsValidHeapPointer(pUserData)

看来问题与堆分配或释放问题有关。

void SomeClass::get()
{
buf = this->download(url);
while (some condition)
{
......
......
bufContent = this->download(url);
......
......
sql = new char[sqlSize];
ZeroMemory(sql,sqlSize);
sql_utf8 = new char[sqlSize*2];
ZeroMemory(sql_utf8,sqlSize*2);
......
......
delete[] bufContent;bufContent=NULL;
delete[] sql;
delete[] sql_utf8;
}
delete[] buf; buf=NULL;//debug run to here, get Assertion Failed error
}

下载函数:

char* SomeClass::download(TCHAR* url)
{
char * pBuf = NULL ;
int nBufLen = 0 ;
TRY
{
// connection
CInternetSession sess ;
sess.SetOption (INTERNET_OPTION_CONNECT_TIMEOUT, 30 * 1000) ;
sess.SetOption (INTERNET_OPTION_CONNECT_BACKOFF, 1000) ;
sess.SetOption (INTERNET_OPTION_CONNECT_RETRIES, 1) ;

DWORD dwFlag = INTERNET_FLAG_TRANSFER_BINARY|INTERNET_FLAG_DONT_CACHE|INTERNET_FLAG_RELOAD ;
CHttpFile * pF = (CHttpFile*)sess.OpenURL(url, 1, dwFlag); ASSERT(pF);
if (!pF)
{AfxThrowInternetException(1);}

// connection status
CString str ;
pF->QueryInfo (HTTP_QUERY_STATUS_CODE, str) ;
if (str != _T("200"))
{
pF->Close() ;
delete pF ;
AfxThrowInternetException(1);
}
// start QzoneBlog
int nLen,nLenCopy;
pF->QueryInfo (HTTP_QUERY_CONTENT_LENGTH, str) ; // file's length
if (_ttoi(str))
{
// know file's size
nLenCopy = nLen = (nBufLen = _ttoi(str)) ;
char * p = (pBuf = new char[nLen+8]) ;
ZeroMemory (p, nLen+8) ;

while (TRUE)
{
int n = pF->Read (p, (nLen < 1024) ? nLen : 1024) ;
if (n <= 0)
break ; // success exit
p += n ; nLen -= n ;
}

// interrupted
if (nLen != 0)
{
//delete[] pBuf; pBuf=NULL;
nBufLen = 0 ;
}
}
pF->Close() ;
delete pF ;
return pBuf;
}
CATCH_ALL(e) {
return 0;
}
END_CATCH_ALL
}

最佳答案

以下说明:

    sql = new char[sqlSize];
ZeroMemory(sql,sizeof(sql));

分配 sqlSize 字节数,然后清除前四个字节,因为 sizeof(sql) 为 4。因此,如果 sqlSize 小于 4,则分配少于 4 个字节,然后将 4 个字节归零,从而破坏内存。你需要的是:

    ZeroMemory(sql,sqlSize);

此外:如果 _ttoi(str) 失败,您不会分配缓冲区,但会返回它,我想您随后会继续尝试释放它。这可能是无效指针异常的原因。

关于c++ - (Visual C++) 删除指针后动态分配内存不是有效指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8834906/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com