2012-05-05 78 views
4

參考參數調用函數對於這個函數:不能在gdb

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中調用這樣的函數?

回答

11

雖然不是直觀的方式,但我仍然可以將其歸類爲一個bug。

您需要一個實際的內存區域(一個變量或堆分配的東西)。

(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) 
0

5是一個文字,當您將它傳遞給函數時,編譯器會嘗試將它存儲在爲函數參數i分配的地址中。但是因爲我是一個參考,所以沒有5可以存儲在內存中,因此你的錯誤。