我有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());
}
我的应用程序正在编译,并且还在运行。但是,当我调用测试函数时,我的应用程序崩溃了。
我们如何解释这个问题?
我想通知我在控制台中得到结果。看来我的测试已经完成了一半,但是当我退出状态时,在第一个do / while循环结束时崩溃了。
最佳答案
关于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
循环具有相同的错误。