C++ Qt调试器与简单运行不同

C++ Qt调试器与简单运行不同,c++,qt,C++,Qt,这段代码检查我们目前拥有的类别。然后它编辑应用程序、电影或歌曲(取决于类别)。然后,当我更改一些信息时,它会将这些更改写入数据库和全局QLists,在QListWidget中更改名称,并在几个标签中显示当前项的信息(这是最后一个函数) 正如您所看到的,除了qlist不同之外,代码是相同的。电影和歌曲都很完美。我可以更改每个细节,它会自动更新列表中的名称 但是,当我更改应用程序的名称并单击“确定”时,它不会更改列表中的名称,也不会更改QList中的应用程序信息 但是,当我使用调试器检查它并单击每个

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

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

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

但是,当我使用调试器检查它并单击每个步骤时,列表会更改名称和信息


因此,基本上我想问的是,为什么上面的代码在使用调试程序完成每个步骤时有效,而不仅仅是在运行它时有效?

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

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

从您的代码来看,每次使用
at()
您都有越界的风险,我想这就是正在发生的事情。您应该检查
at()
list->item(row)
的所有实例是否超出范围


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

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

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

从您的代码来看,每次使用
at()
您都有越界的风险,我想这就是正在发生的事情。您应该检查
at()
list->item(row)
的所有实例是否超出范围

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

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);

}