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が異なることを除いて同じコードです。映画と歌は完璧に機能します。すべての詳細を変更でき、リスト内の名前が自動的に更新されます。

しかし、アプリの名前を変更して [OK] をクリックしても、リスト内の名前は変更されず、ファイル内のアプリ情報も変更されませんQList

ただし、デバッガーを使用してすべてのステップをクリックすると、リストの名前と情報が変更されます。

したがって、基本的に私が尋ねようとしているのは、デバッガーを使用して各ステップを実行するときに上記のコードが機能するのに、実行するだけでは機能しないのはなぜですか?

4

1 に答える 1

4

あなたが「単純な実行」と呼んでいるのは、実際には IDE を「ビルドから実行」モードで使用しており、実際にはデバッグ ビルドと最適化されたリリース ビルドを比較していると思います。デバッガーは、すべてのメモリを適切にゼロに初期化しますが、これはリリース ビルドでは発生しません。

何をしているかに関係なく、この動作は不正なメモリ アクセスを示しています。

使用するたびにコードからat()、範囲外になるリスクがあります。それが起こっていると思います。およびのすべてのインスタンスをチェックする必要があり、範囲外にat()もなりません。list->item(row)

さらに、 を使用するlistと と混同される危険性があるstd::listため、この変数の名前を変更する必要があります。

于 2013-11-09T01:09:32.710 に答える