我的应用程序崩溃使用Do / While循环来解析表

时间:2016-01-27 00:04:06

标签: c++ arrays qt crash do-while

我有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循环结束时崩溃。

Console Output

2 个答案:

答案 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]));
}