QT emit信号的时候出问题,“底层由于接收到。。。”出错。

Donal_zero 2015-09-19 09:41:26
写程序的过程中,要用UDP接数,并解析后传输到别的类里面去。
void CNetMng::slot_ReceiveNavData()
{
if (m_pUdpNavReceive->hasPendingDatagrams())
{
QByteArray datagram;
int size=m_pUdpNavReceive->bytesAvailable();
datagram.resize(size);
m_pUdpNavReceive->readDatagram(datagram.data(),datagram.size());
STNavDataPkg *navDataPkg = new STNavDataPkg();
if (datagram[8]==0xd4||datagram[8]==0xd5)
{
if (datagram[8]==0xd4)
m_sysType=NAV_SYS_GPS;
else
m_sysType=NAV_SYS_BD2;
//memcpy(&m_navDataPkg,datagram.data(),pkgSize);
navDataPkg = (STNavDataPkg*)(datagram.data());
emit sig_NavPkgIUpdated(m_sysType,navDataPkg->navCodePkgI);
}
}
}

代码如上,就在最后一行 emit sig_NavPkgIUpdated出问题,如果我把他注释掉,就不会报错,运行也正常,但是加上这一行代码之后就会报错。如果我不把这个信号connect到别的slots,也不会报错。

void CNetMng::sig_NavPkgIUpdated(EnumNavSysType _t1, STNavCodePkgI _t2)
{
void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)), const_cast<void*>(reinterpret_cast<const void*>(&_t2)) };
QMetaObject::activate(this, &staticMetaObject, 2, _a);
}

报错后,会跳到上面这一段代码里,一直也找不到原因。
...全文
1471 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
donwmufromdying 2018-10-08
  • 打赏
  • 举报
回复
这代码有点可怕的。STNavDataPkg *navDataPkg = new STNavDataPkg(); 都没有释放,然后后边又是navDataPkg = (STNavDataPkg*)(datagram.data()); 把一个局部对象的data指针付给这个变量。
a013152 2018-10-06
  • 打赏
  • 举报
回复
遇到类似的线程发送信号报错的问题,推测楼主的m_pUdpNavReceive->readDatagram(....) 底层代码使用了ReadFile函数接收数据,可以参考我的问题与解决方法。

我的问题起因:char buf[128] = {0}; ReadFile(s_hPipe, buf, 256, &rlen, NULL); ReadFile接收的buf只有128小于设置的256。之后只要emit信号就报错。

解决方法: 把ReadFile接收buf设置256 或者更大。
满桌烟灰 2017-03-06
  • 打赏
  • 举报
回复
你的信号和槽是同一个函数声明!!!!!! 声明为信号的函数没有具体的实现代码,只有槽函数才有。
wayne-k 2017-03-05
  • 打赏
  • 举报
回复
要是解决了给分享下吧,先谢了!!
wayne-k 2017-03-05
  • 打赏
  • 举报
回复
楼主问题解决了吗,我也遇到同样的问题了
hxgtxz 2015-09-20
  • 打赏
  • 举报
回复
高手啊高手,受教了
Donal_zero 2015-09-20
  • 打赏
  • 举报
回复
引用 1 楼 foruok 的回复:
navDataPkg = (STNavDataPkg*)(datagram.data()); 这行代码出错了兄弟,datagram.data(),访问之后,一旦出了访问的地方,就是野指针了,所以,你发信号传递出去的是个野指针,因为槽被调用时,你的datagram已经析构了,它持有的数据也没了。
谢谢啊。 怀疑是指针越界了,我试着用过 STNavDataPkg navDataPkg; memcpy(&navDataPkg,datagram.data()); 这样然后再发信号,但是还是会报错。还有就是navDataPkg->navCodePkgI这个变量并不是指针。这样也会有问题吗?
foruok 2015-09-19
  • 打赏
  • 举报
回复
navDataPkg = (STNavDataPkg*)(datagram.data()); 这行代码出错了兄弟,datagram.data(),访问之后,一旦出了访问的地方,就是野指针了,所以,你发信号传递出去的是个野指针,因为槽被调用时,你的datagram已经析构了,它持有的数据也没了。

16,199

社区成员

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

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