请教关于QT中内存释放的问题

masuz1 2016-09-18 11:23:42
我通过 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;
}
}
}

请问上述情况该如何处理?谢谢!
...全文
1497 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复

foreach(STRUCT_TEST & i, infoList ){
if(i.pMemInfo){
delete [] i.pMemInfo;
i.pMemInfo = NULL;
}
}

donwmufromdying 2020-04-15
  • 打赏
  • 举报
回复

// 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;
    }
}
资源互换 2020-04-15
  • 打赏
  • 举报
回复
逗比,list的大小在删除时是动态的!
into len = list. length();
for(int i=0;i<len;i++)
delete 指针
Little柯南 2016-09-26
  • 打赏
  • 举报
回复
引用 5 楼 masuz1 的回复:
[quote=引用 3 楼 hidxl 的回复:] 别用byte 用 qbytearray
请问 QByteArray可以直接转换为 Struct指针吗?该如何使用呢?[/quote] QByteArray实质是个char*加size数值,你提取出来char*指针将他赋值给你的Struct就可以了
诺水城子 2016-09-22
  • 打赏
  • 举报
回复
指针指向问题
masuz1 2016-09-20
  • 打赏
  • 举报
回复
补充: 如果在析构时采用倒序释放内存,第一个(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不一致,感觉很奇怪!??
masuz1 2016-09-20
  • 打赏
  • 举报
回复
引用 7 楼 qq_36177886 的回复:
我觉得是螺旋删除的问题,如果你的list只有2个大小,那你删除list[0]之后,原本的list【1】就会变成list【0】,那这个时候你的i=1,就越界了
我并没有删除元素,只是把元素struct内的指针清空了。跟你说的情况不一样
masuz1 2016-09-20
  • 打赏
  • 举报
回复
引用 6 楼 wd350355942 的回复:
qDeleteAll(infoList); infoList.clear();
qDeleteAll 试过不行,infoList内的元素是Struct不是Object
masuz1 2016-09-19
  • 打赏
  • 举报
回复
引用 3 楼 hidxl 的回复:
别用byte 用 qbytearray
请问 QByteArray可以直接转换为 Struct指针吗?该如何使用呢?
masuz1 2016-09-19
  • 打赏
  • 举报
回复
引用 2 楼 Inhibitory 的回复:
P_MEM_INFO pInfo = (P_MEM_INFO) new BYTE[sizeOfMeminfo]; 不对,看看 new 和 malloc 的区别
谢谢你的建议! 我按你的提示对 new/delete[]、malloc/free、HeapAlloc/HeapFree三种方式都进行了测试,其中new/delete与malloc/free都是在i==1时报同样的Heap错误,HeapFree在i==1时报“Critical error detected c0000374”错误。 能否再帮分析一下?谢谢!
东莞某某某 2016-09-19
  • 打赏
  • 举报
回复
用 new MEM_INFO来试试
qq_36177886 2016-09-19
  • 打赏
  • 举报
回复
我觉得是螺旋删除的问题,如果你的list只有2个大小,那你删除list[0]之后,原本的list【1】就会变成list【0】,那这个时候你的i=1,就越界了
Z_墨脱 2016-09-19
  • 打赏
  • 举报
回复
qDeleteAll(infoList); infoList.clear();
hidxl 2016-09-18
  • 打赏
  • 举报
回复
别用byte 用 qbytearray
Inhibitory 2016-09-18
  • 打赏
  • 举报
回复
P_MEM_INFO pInfo = (P_MEM_INFO) new BYTE[sizeOfMeminfo]; 不对,看看 new 和 malloc 的区别
masuz1 2016-09-18
  • 打赏
  • 举报
回复
补充:使用 delete[] 释放空间也是同样的报错。

16,815

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧