按值传递的参数在 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)
问题消失,调试器和代码再次具有相同的签名。
通过 value/reference 是 C++ 方面。在汇编级别,一个大的结构可能仍然被复制到某个地方并通过指针传递。它是您正在处理副本的 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)
问题消失,调试器和代码再次具有相同的签名。
通过 value/reference 是 C++ 方面。在汇编级别,一个大的结构可能仍然被复制到某个地方并通过指针传递。它是您正在处理副本的 C++ 语义,但程序集不能按值传递各种结构。