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 に答える