发送信号中内存非法访问

时间:2021-04-27 18:15:27

///////////////////////////////////////////////////////////
//常量定义
#define STR_TOTALLINE_TYPE_USER QString::fromUtf8("内线")
#define STR_TOTALLINE_TYPE_TRUNK QString::fromUtf8("外线")
#define STR_TOTALLINE_TYPE_EMPTY QString::fromUtf8("悬空")
#define STR_TOTALLINE_TYPE_RECORD QString::fromUtf8("录音")

///////////////////////////////////////////////////////////
//signal 定义
signals:
void outTableItem(int nRow, int nCol, QString label);

////////////////////////////////////////////////////////////
//signal 使用
long lType;

QString strText;

/*usTotalLine > 8*/
for (int i = 0; i < usTotalLine; i++) {

lType = CheckChTypeNew(i);
switch (lType) {
case CHTYPE_USER:
strText = STR_TOTALLINE_TYPE_USER;
break;
case CHTYPE_TRUNK:
strText = STR_TOTALLINE_TYPE_TRUNK;
break;
case CHTYPE_EMPTY:
strText = STR_TOTALLINE_TYPE_EMPTY;
break;
case CHTYPE_RECORD:
strText = STR_TOTALLINE_TYPE_RECORD;
break;
}

/*我注释一种的任何一句emit 程序做一次循环就出现内存的非法访问*/
/*如果不注释 程序可以做3次循环*/
/*debug 发现是QString一起的错误*/
emit
outTableItem(i, INT_TOTALLINE_ITEM_NUM, QString::number(i));
emit
outTableItem(i, INT_TOTALLINE_ITEM_TYPE, strText);
msleep(500);
}

/////////////////////////////////////////////////////////////////
//slot 定义
public slots:
void startServer(bool checked);

/////////////////////////////////////////////////////////////////
//connect
connect(&classVoiceSystem, SIGNAL(outTableItem(int, int, QString)), this,
SLOT(setTableItem(int, int, QString)));

/////////////////////////////////////////////////////////////////
//slot 我屏蔽主体语句错误依然 可以排除slot中的问题
void CallCenterServer::setTableItem(int nRow, int nCol, QString label) {
QTableWidgetItem *item = new QTableWidgetItem(label);
ui.tableWidget->setItem(nRow, nCol, item);
}

56 个解决方案

#1


是否没有指定QTableWidget的行、列数?

#2


恩 指定了 
我又发现 emit 时  变量 i, 和 lType 会被改变
声明const 也不行

#3


int i的作用域是for循环,
你在for的外面使用了i

#4


请问怎么解决
去除引用?

#5


改成这样:
int i ;
for (i = 0; i < usTotalLine; i++) {

引用 4 楼 wind185 的回复:
请问怎么解决
去除引用?

#6


引用 5 楼 tingsking18 的回复:
改成这样:
int i ;
for (i = 0; i < usTotalLine; i++) {

引用 4 楼 wind185 的回复:

请问怎么解决
去除引用?


谢谢 还是不行 
emit后i值就被改变了

#7


顶起.....

我该了代码
新错误:

循环发射信号 i的值被改变 
为什么啊 

for (int i = 0; i < (int) ulTotalLine; i++) {

switch (CheckChTypeNew(i)) {
case CHTYPE_USER:
strType = new QString(STR_LINE_TYPE_USER);
break;
case CHTYPE_TRUNK:
strType = new QString(STR_LINE_TYPE_TRUNK);
break;
case CHTYPE_EMPTY:
strType = new QString(STR_LINE_TYPE_EMPTY);
break;
case CHTYPE_RECORD:
strType = new QString(STR_LINE_TYPE_RECORD);
break;
}
emit outTableItem(i, INT_TOTALLINE_ITEM_TYPE, strType);
emit outLog(QString::number(i));
msleep(500);
}
}


谢谢

#8


不错,谢谢楼主,真的不错

#9


你确定你的行和列数目是正确的吗??

#10


sssssssssss

#11


不错,虽然没看懂。。

#12


不错,我收藏了.

#13


不错,学习了

#14


楼主不错呢,虽然提不出什么建议,但是顶起来,up

#15


按时接分

#16


我只是来看看

#17


signals:
    void outTableItem(int nRow, int nCol, const QString& label);

#18


路过。。。。。

#19


学习了

#20


收藏收藏~~~~

#21


学习学习

#22


挺好的,学习一下

#23


内存越界了

#24


神奇
。。。。。。。。。。。。。

#25


来看看!!!

#26


这个不懂,等待高手解决了

#27


太长。心情不好,读不下去了。

#28


hao  

#29


听说评论有分

#30


学习中分享中

#31


fdsui hfasoihf alskenf lk;sajdf

#32


int i的作用域是for循环,
你在for的外面使用了i 
 

#33


bszahaha

#34


来看看。学习了......

#35


学习了,,,

#36


虽然看的不是很了解,学习学习!

#37


学习 学习

#38


谢谢大家!
我搞错了 不是信号的问题 
我调用库函数CheckChTypeNew()引起的错误

一场误会......

#39


路过...........

#40


学习中

#41


-----------------------------

#42


不错,我懂了

#43


看看。。

#44


学习了

#45


虽然看的不是很了解,学习学习!

#46


路过,路过,学习

#47


学习了,,,,

#48


ereup

#49


dddddddddddddddd

#1


是否没有指定QTableWidget的行、列数?

#2


恩 指定了 
我又发现 emit 时  变量 i, 和 lType 会被改变
声明const 也不行

#3


int i的作用域是for循环,
你在for的外面使用了i

#4


请问怎么解决
去除引用?

#5


改成这样:
int i ;
for (i = 0; i < usTotalLine; i++) {

引用 4 楼 wind185 的回复:
请问怎么解决
去除引用?

#6


引用 5 楼 tingsking18 的回复:
改成这样:
int i ;
for (i = 0; i < usTotalLine; i++) {

引用 4 楼 wind185 的回复:

请问怎么解决
去除引用?


谢谢 还是不行 
emit后i值就被改变了

#7


顶起.....

我该了代码
新错误:

循环发射信号 i的值被改变 
为什么啊 

for (int i = 0; i < (int) ulTotalLine; i++) {

switch (CheckChTypeNew(i)) {
case CHTYPE_USER:
strType = new QString(STR_LINE_TYPE_USER);
break;
case CHTYPE_TRUNK:
strType = new QString(STR_LINE_TYPE_TRUNK);
break;
case CHTYPE_EMPTY:
strType = new QString(STR_LINE_TYPE_EMPTY);
break;
case CHTYPE_RECORD:
strType = new QString(STR_LINE_TYPE_RECORD);
break;
}
emit outTableItem(i, INT_TOTALLINE_ITEM_TYPE, strType);
emit outLog(QString::number(i));
msleep(500);
}
}


谢谢

#8


不错,谢谢楼主,真的不错

#9


你确定你的行和列数目是正确的吗??

#10


sssssssssss

#11


不错,虽然没看懂。。

#12


不错,我收藏了.

#13


不错,学习了

#14


楼主不错呢,虽然提不出什么建议,但是顶起来,up

#15


按时接分

#16


我只是来看看

#17


signals:
    void outTableItem(int nRow, int nCol, const QString& label);

#18


路过。。。。。

#19


学习了

#20


收藏收藏~~~~

#21


学习学习

#22


挺好的,学习一下

#23


内存越界了

#24


神奇
。。。。。。。。。。。。。

#25


来看看!!!

#26


这个不懂,等待高手解决了

#27


太长。心情不好,读不下去了。

#28


hao  

#29


听说评论有分

#30


学习中分享中

#31


fdsui hfasoihf alskenf lk;sajdf

#32


int i的作用域是for循环,
你在for的外面使用了i 
 

#33


bszahaha

#34


来看看。学习了......

#35


学习了,,,

#36


虽然看的不是很了解,学习学习!

#37


学习 学习

#38


谢谢大家!
我搞错了 不是信号的问题 
我调用库函数CheckChTypeNew()引起的错误

一场误会......

#39


路过...........

#40


学习中

#41


-----------------------------

#42


不错,我懂了

#43


看看。。

#44


学习了

#45


虽然看的不是很了解,学习学习!

#46


路过,路过,学习

#47


学习了,,,,

#48


ereup

#49


dddddddddddddddd