gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-27 23:11:42 24 4
gpt4 key购买 nike

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 中的应用程序信息。

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

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

最佳答案

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

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

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

此外,使用 list 存在与 std::list 混淆的风险,因此应重命名此变量。

关于c++ - Qt 调试器与简单运行不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19869248/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com