无法在 gdb 中使用引用参数调用函数

Cannot call function with reference parameter in gdb

本文关键字:引用 参数 调用 函数 gdb      更新时间:2023-10-16

对于此函数:

void foo_ref(const int& i)
{
  cout << i << endl;
}

当我在 gdb 中调用它时它失败了:

(gdb) call foo_ref(5)
Attempt to take address of value not located in memory.

当然,在这个简单的示例中,没有必要使用引用作为参数。 如果我使用普通的"int",那就没问题了。
实际上,真正的示例是一个模板函数,如下所示:

template<class T>
void t_foo_ref(const T& i)
{
  cout << i << endl;
}

当"T"是"int"时,我遇到了上面提到的问题。

它是 gdb 中的错误吗? 或者我可以在 gdb 中调用这样的函数吗?

这是可能的,尽管不是以直观的方式(我仍然会将其归类为错误)。

您需要一个实际的内存区域(变量或堆分配的内容)。

(gdb) p (int *) malloc(sizeof(int))
$8 = (int *) 0x804b018
(gdb) p * (int *) 0x804b018 = 17
$9 = 17
(gdb) p t_foo_ref<int>((const int&) * (const int *) 0x804b018 )
17
$10 = void
(gdb)

5 是一个文字,当您将其传递给函数时,编译器会尝试将其存储在为函数参数 i 分配的地址中。但是由于 i 是一个参考,因此没有 5 可以存储在内存中的位置,因此您的错误。