6

对于此功能:

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 中调用这样的函数吗?

4

2 回答 2

15

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

你需要一个实际的内存区域(一个变量,或者堆分配的东西)。

(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)
于 2012-05-05T10:05:30.253 回答
0

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

于 2012-05-05T10:05:12.610 回答