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