Qt调试器与简单运行不同

时间:2013-11-08 21:56:37

标签: c++ qt

void MainWindow::edit()
{
    //Check if item is selected, if not return
    const int row = list->currentRow();
    if( row == -1 )
        return;

    EditWindow w( this, currentCategory() );

    switch( currentCategory() )
    {
    case cApp:
    {
        App old = appList.at( row );
        w.setApp( old );
        if( w.exec() == QDialog::Rejected )
            return;
        if( old == w.app() ) return;
        else old = w.app();

        if( dm->updateApp( old ) ){
            appList.replace( row, old );
            list->item(row)->setText( old.name() );
        }

        break;
    }
    case cFilm:
    {
        Film old = filmList.at( row );
        w.setFilm( old );
        if( w.exec() == QDialog::Rejected )
            return;
        if( old == w.film() ) return;
        else old = w.film();

        if( dm->updateFilm( old ) ){
            filmList.replace( row, old );
            list->item(row)->setText( old.name() );
        }

        break;
    }
    case cSong:
    {
        Song old = songList.at( row );
        w.setSong( old );
        if( w.exec() == QDialog::Rejected )
            return;

        if( old == w.song() ) return;
        else old = w.song();

        if( dm->updateSong(old) ){
            songList.replace( row, old );
            list->item(row)->setText( old.name() );
        }

        break;
    }
    }

    displayItem(row);

}

此代码检查我们目前所属的类别。然后它编辑应用程序,电影或歌曲(取决于类别)。然后,当我更改某些信息时,它会将这些更改写入数据库和全局QLists,更改QListWidget中的名称,并在几个标签中显示当前项目的信息(这是最后一项功能)。

正如您所看到的,除了QLists不同之外,它们的代码相同。电影和歌曲完美无缺。我可以更改每个细节,它会自动更新列表中的名称。

但是,当我更改应用程序的名称并单击“确定”时,它不会更改列表中的名称,也不会更改QList中的应用程序信息。

但是,当我使用调试器并单击每一步时,列表会更改名称和信息。

所以基本上我要问的是,为什么上面的代码在使用调试器完成每个步骤时才起作用,而不是在运行它时呢?

1 个答案:

答案 0 :(得分:4)

我猜你所谓的“简单运行”实际上是在“构建运行”模式下使用IDE,而实际上是在比较调试版本和优化版本构建。调试器正确地将所有内存初始化为零,这在发布版本中不会发生。

无论您正在做什么,此行为都表示非法内存访问。

每次使用at()时,你的代码就会出现超出界限的风险,我想这就是发生的事情。您应该检查at()的所有实例以及list->item(row)不会超出范围。

此外,使用list可能会与std::list混淆,因此应重命名此变量。