16,815
社区成员




// 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;
}
}
}
foreach(STRUCT_TEST & i, infoList ){
if(i.pMemInfo){
delete [] i.pMemInfo;
i.pMemInfo = NULL;
}
}
// 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;
}
}
// 析构
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不一致,感觉很奇怪!??