我有2个QCheckbox表,每个表包含11个元素。 我在课堂上宣布他们如下:
QCheckBox *sectionTable[10];
QCheckBox *postTable[10];
对于每个QCheckBox,我都这样做
QCheckBox* checkboxA = new QCheckBox("A");
sectionTable[0] = checkboxA;
通过我的测试方法,我想返回QCheckbox表中每个元素的内容。 为此,我做了这个测试:
/** TEST() **/
void VGCCC::test()
{
sectionTable[0]->setText("A");
sectionTable[1]->setText("B");
sectionTable[2]->setText("C");
sectionTable[3]->setText("D");
postTable[0]->setText("E");
postTable[1]->setText("F");
postTable[2]->setText("G");
postTable[3]->setText("H");
int i=0;
do
{
m_testTextEdit->insertPlainText(sectionTable[i]->text());
std::cout << "SECTION TABLE " << sectionTable[i]->text().toStdString() << "\n" << std::endl;
i++;
}
while(!sectionTable[i]->text().isNull());
do
{
m_testTextEdit->insertPlainText(postTable[i]->text());
std::cout << "POST TABLE " << postTable[i]->text().toStdString() << "\n" << std::endl;
i++;
}
while(!postTable[i]->text().isEmpty());
}
我的应用程序正在编译,并且还在运行。但是当我调用测试函数时,我的应用程序崩溃了。
我们如何解释这个问题?
我想通知我在我的控制台中得到了一个结果。看来我的测试是半工作,但是当我摆脱了我的状态时,在第一次执行/ while循环结束时崩溃。
答案 0 :(得分:3)
关于11个元素:QCheckBox *sectionTable[10];
仅为元素定义10个插槽(0到9)。
int i=0;
do
{
m_testTextEdit->insertPlainText(sectionTable[i]->text());
std::cout << "SECTION TABLE " << sectionTable[i]->text().toStdString() << "\n" << std::endl;
i++;
}
while(!sectionTable[i]->text().isNull());
是否有可能达到十个或十一个元素。除非先前找到终止条件,否则无法阻止sectionTable[i]
尝试阅读sectionTable[11]
来调用其text
方法。如果它能够在超出范围sectionTable[11]->text()
的呼叫中存活,则会尝试呼叫sectionTable[11]->text().isNull()
。可能这也是可以存活的,而不是NULL。在这种情况下,将sectionTable[12]
进行测试。这将一直持续到程序遇到非常糟糕的记忆和崩溃,发现无效,或猪成为我们都知道他们真正希望成为的航空公司的恐怖。
请注意,此循环后i
未设置回0,因此下一循环中要检查的第一个postTable
将与上一个sectionTable
处于同一索引。
因此,如果sectionTable[5]->text().isNull()
为NULL,则postTable[5]
将成为第一个postTable
索引和检查过的。
do
{
m_testTextEdit->insertPlainText(postTable[i]->text());
std::cout << "POST TABLE " << postTable[i]->text().toStdString() << "\n" << std::endl;
i++;
}
while(!postTable[i]->text().isEmpty());
此循环在退出条件中与sectionTable
循环具有相同的错误。
答案 1 :(得分:0)
我找到了解决问题的方法。如前面的答案(@ user4581301)中所述,我没有将我的迭代器i设置为0。
另外,为了避免“超出范围”崩溃,我提出了第二个条件i<sizeof(sectionTable[i]);
这是我的功能测试功能:
/** TEST() **/
void VGCCC::test()
{
int i = 0;
do
{
m_testTextEdit->insertPlainText(sectionTable[i]->text());
std::cout << "SECTION TABLE " << m_materialMap[sectionTable[i]].c_str() << "\n" << std::endl;
i++;
}
while(!sectionTable[i]->text().isNull() && i<sizeof(sectionTable[i]));
i = 0;
do
{
m_testTextEdit->insertPlainText(postTable[i]->text());
std::cout << "POST TABLE " << postTable[i]->text().toStdString() << "\n" << std::endl;
std::cout << "POST TABLE " << m_materialMap[postTable[i]].c_str() << "\n" << std::endl;
i++;
}
while(!postTable[i]->text().isEmpty() && i<sizeof(postTable[i]));
}