提问人:Schnaffon 提问时间:6/10/2019 最后编辑:Schnaffon 更新时间:6/10/2019 访问量:349
按值传递的参数在 Visual Studio 2010 C++ 的调试器中显示为通过引用传递
Argument passed by value appears as passed by reference in the debugger in Visual Studio 2010, C++
问:
我目前正在调试一个我已经工作了一段时间的项目,并且,由于我想知道 QString 命名文件的内容,因此在我监视的变量中写入了 file.d,我刚刚注意到该文件实际上是一个地址。
问题是,文件不是我代码中的地址。
这是我的功能:
void MyClass::updateFile(QString file, QTreeWidgetItem *item)
{
if(file.isEmpty())
return;
QFile f(file); // Line were I had the breakpoint
...
}
所以我检查了堆栈,它真的写好了
updateFile(QString *file, QTreeWidgetItem *item)
我首先想到的是编译器优化,但由于我处于调试模式,这似乎不太可能。
你有解释吗?
编辑:当我将签名更改为
void MyClass::updateFile(QString const &file, QTreeWidgetItem *item)
问题消失,调试器和代码再次具有相同的签名。
答:
0赞
Michael Chourdakis
6/10/2019
#1
按值/引用传递是 C++ 的一个方面。在程序集级别,一个大结构可能仍会复制到某个位置并通过指针传递。它是您正在处理重复的 C++ 语义,但程序集不能按值传递各种结构。
评论
0赞
Schnaffon
6/10/2019
调试器不应该隐藏这个吗?由于它旨在帮助查找代码中的错误,因此它显示了这种内部操作,这非常令人惊讶。
0赞
Michael Chourdakis
6/10/2019
好吧,您的调试器很旧,请尝试 VS 2019。
评论
void MyClass::updateFile(QString file, QTreeWidgetItem *item)
并且是两个不同的函数,由于函数重载。void MyClass::updateFile(QString *file, QTreeWidgetItem *item)
QString