使用QT出大问题了!!!

Qicoico 2010-12-29 06:37:34
ASSERT failure in QVector<T>::at: "index out of range"
我用了一个线程等待消息,等到消息后,放入QStringList,然后打印。以下是该线程函数的代码:

while(1)
{
ERROR_NO perr = ERR_UNKNOWN;
uint32 msgItem = portMessageQPend(gLocalUpdateUpdateStatusMsgQ, 0, &perr);
if (ERR_SUCCESS == perr)
{
mutex.lock();
LOCAL_UPDATE_MSG_ITEM item = *((LOCAL_UPDATE_MSG_ITEM*)&msgItem);
MEM_HANDLE hData = item.msg_data;
int dataLen = mem_len(hData);
unsigned char *buf = new unsigned char[dataLen];
mem_read(buf, dataLen, hData, 0, dataLen);
mem_free(hData);

if (item.msg_type == UPDATE_DATA_INFO)
{
char updateBuf[256] = {0};
char temp_buf[10];
for(int i = 0; i < dataLen; i++)
{
sprintf_s(temp_buf,10,"%02x,",buf[i]);
strcat(updateBuf, temp_buf);
}

strList.append(QString::fromLocal8Bit(updateBuf));
}
else
{
strList.append(QString::fromLocal8Bit((const char*)buf));
}

int count = strList.count();
if(count > 20)
strList.erase(strList.begin());
strModel.setStringList(strList);

delete[] buf;
mutex.unlock();
}

}

望各位大侠给个解决方案啊!
...全文
882 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
Qicoico 2011-01-10
  • 打赏
  • 举报
回复
最近比较忙,没发代码了,不过还是十分感谢啊!额,那个东西决定重新改一下整体的框架。
  • 打赏
  • 举报
回复
主要的.h/.cpp都粘上来,我有时间帮你调试一下
Qicoico 2011-01-05
  • 打赏
  • 举报
回复
没有搞定那,郁闷。。。
  • 打赏
  • 举报
回复
yangglemu@163.com
Qicoico 2011-01-05
  • 打赏
  • 举报
回复
我留下邮箱:dothingsbycpp@163.com。可以发到我邮箱,我把附件发给你,非常感谢了!
Qicoico 2011-01-05
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 yangglemu 的回复:]

主要的.h/.cpp都粘上来,我有时间帮你调试一下
[/Quote]
这位大哥太热心了,在这里非常感谢了!
wyjam 2011-01-05
  • 打赏
  • 举报
回复
if(count > 20)
strList.erase(strList.begin()); 扔一个断点在这里看下。

jiwenn 2011-01-05
  • 打赏
  • 举报
回复
<Script>alert("aaa")</Script>
Qicoico 2010-12-31
  • 打赏
  • 举报
回复
怎么没人理我了?
  • 打赏
  • 举报
回复
最后一招了,打断点,定位出错的地方
Qicoico 2010-12-30
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 yangglemu 的回复:]

如果int dataLen = mem_len(hData)的dataLen大于256
updateBuf[256]这个缓冲区有可能溢出
再这样strList.append(QString::fromLocal8Bit((const char*)buf)),就可能访问到保护内存

updateBuf[dataLen]这样声明变量如何?
[/Quote]
dataLen最长42字节, 转换成"%02x,"格式,是126个字节,不会溢出啊。updateBuf[dataLen]这样声明变量,我试过了,不行。不过还是谢谢。
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 dizuo 的回复:]
strList应该是QList吧,
QList也是用QVector实现的。
[/Quote]

QVector是动态数组,依然是数组
QList是线性表,上个节点保存一个指向下个节点的指针
  • 打赏
  • 举报
回复
如果int dataLen = mem_len(hData)的dataLen大于256
updateBuf[256]这个缓冲区有可能溢出
再这样strList.append(QString::fromLocal8Bit((const char*)buf)),就可能访问到保护内存

updateBuf[dataLen]这样声明变量如何?
Qicoico 2010-12-29
  • 打赏
  • 举报
回复
我想知道如何解决这个问题啊?各位大侠, 给点意见啊!!!
Qicoico 2010-12-29
  • 打赏
  • 举报
回复
变量声明:
QStringList strList;
QStringListModel strModel;
ryfdizuo 2010-12-29
  • 打赏
  • 举报
回复
strList应该是QList吧,
QList也是用QVector实现的。
  • 打赏
  • 举报
回复
错误提示QVector访问越界,检查一下你是否用了QVector向量

16,235

社区成员

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

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