我通過 new BYTE[szSize]的方式創建了struct指標,然后把它們加入QList,當整個物件釋放的時候,再遍歷QList逐一delete指標,但是每次釋放到第2個指標物件時均報以下錯誤:
HEAP[xxx.exe]: Invalid address specified to RtlValidateHeap( 000000FD6A3E0000, 000000FD7367C330 )
代碼如下:
// XObject.h
typedef struct _MEM_INFO
{
DWORD Index;
UINT Type;
char Info[INFO_SIZE+1];
...
} MEM_INFO, *P_MEM_INFO;
typeof struct _STRUCT_TEST
{
P_MEM_INFO pMemInfo;
...
}STRUCT_TEST;
...
class XObject //XObject 不是繼承自 QObject!
{
private:
QList<STRUCT_TEST> testList;
...
};
// XObject.cpp
void XObject::Create()
{
for(int i=0;i<10;i++){
P_MEM_INFO pInfo = (P_MEM_INFO) new BYTE[sizeOfMeminfo];
...
STRUCT_TEST test;
test.pMemInfo = pInfo;
infoList.append(test);
}
...
}
// 析構
XObject::~XObject()
{
for(int i=0;i<infoList.length();++i){
STRUCT_TEST *pTest = &(infoList[i]);
if(pTest->pMemInfo){
delete pTest->pMemInfo; // i == 1 時出錯:HEAP[xxx.exe]: Invalid address specified to RtlValidateHeap( 000000FD6A3E0000, 000000FD7367C330 )
pTest->pMemInfo = NULL;
}
}
}
請問上述情況該如何處理?謝謝!
uj5u.com熱心網友回復:
補充:使用 delete[] 釋放空間也是同樣的報錯。uj5u.com熱心網友回復:
P_MEM_INFO pInfo = (P_MEM_INFO) new BYTE[sizeOfMeminfo];不對,看看 new 和 malloc 的區別
uj5u.com熱心網友回復:
別用byte 用 qbytearrayuj5u.com熱心網友回復:
謝謝你的建議!
我按你的提示對 new/delete[]、malloc/free、HeapAlloc/HeapFree三種方式都進行了測驗,其中new/delete與malloc/free都是在i==1時報同樣的Heap錯誤,HeapFree在i==1時報“Critical error detected c0000374”錯誤。
能否再幫分析一下?謝謝!
uj5u.com熱心網友回復:
請問 QByteArray可以直接轉換為 Struct指標嗎?該如何使用呢?
uj5u.com熱心網友回復:
qDeleteAll(infoList);infoList.clear();
uj5u.com熱心網友回復:
我覺得是螺旋洗掉的問題,如果你的list只有2個大小,那你洗掉list[0]之后,原本的list【1】就會變成list【0】,那這個時候你的i=1,就越界了uj5u.com熱心網友回復:
用 new MEM_INFO來試試uj5u.com熱心網友回復:
qDeleteAll 試過不行,infoList內的元素是Struct不是Object
uj5u.com熱心網友回復:
我并沒有洗掉元素,只是把元素struct內的指標清空了。跟你說的情況不一樣
uj5u.com熱心網友回復:
補充:如果在析構時采用倒序釋放記憶體,第一個(length()-1)就會報錯!
// 析構
XObject::~XObject()
{
for(int i=infoList.length()-1;i>=0;--i){
STRUCT_TEST *pTest = &(infoList[i]);
if(pTest->pMemInfo){
delete pTest->pMemInfo;
// i == (infoList.length()-1) 時出錯:
// HEAP[xxx.exe]: Invalid address specified to RtlValidateHeap( 01200000, 0BC2FB18 )
pTest->pMemInfo = nullptr;
}
}
}
另外,跟蹤發現報錯的記憶體地址 0BC2FB18 與 pTest->pMemInfo實際地址 0xbc2fb38不一致,感覺很奇怪!??
uj5u.com熱心網友回復:
指標指向問題uj5u.com熱心網友回復:
QByteArray實質是個char*加size數值,你提取出來char*指標將他賦值給你的Struct就可以了
uj5u.com熱心網友回復:
逗比,list的大小在洗掉時是動態的!into len = list. length();
for(int i=0;i<len;i++)
delete 指標
uj5u.com熱心網友回復:
// XObject.h
typedef struct _MEM_INFO
{
DWORD Index;
UINT Type;
char Info[INFO_SIZE+1];
...
} MEM_INFO, *P_MEM_INFO;
typeof struct _STRUCT_TEST
{
P_MEM_INFO pMemInfo;
...
}STRUCT_TEST;
...
class XObject //XObject 不是繼承自 QObject!
{
private:
QList<STRUCT_TEST> testList;
...
};
// XObject.cpp
void XObject::Create()
{
unsigned sizeOfMeminfo = sizeof( MEM_INFO );
for(int i=0;i<10;i++){
STRUCT_TEST test;
test.pMemInfo = (P_MEM_INFO) new BYTE[sizeOfMeminfo];
testList.append(test);
}
...
}
// 析構
XObject::~XObject()
{
for(int i=0;i< testList.size();++i){
delete[] testList.at(i).pMemInfo;
}
}
uj5u.com熱心網友回復:
foreach(STRUCT_TEST & i, infoList ){
if(i.pMemInfo){
delete [] i.pMemInfo;
i.pMemInfo = NULL;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/42429.html
標籤:Qt
