0
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.

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

所以基本上我想问的是为什么上面的代码在使用调试器通过每个步骤时有效,但在运行它时无效?

4

1 回答 1

4

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

无论您在做什么,这种行为都表明存在非法内存访问。

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

此外 usinglist有与 混淆的风险std::list,因此应重命名此变量。

于 2013-11-09T01:09:32.710 回答