2013-07-18 28 views
0
int* g() { 
    int j = 2; 
    return &j; 
} 

int main() { 
    using namespace std; 

    int v = *g(); 
    // assert(v == 2); // Valgrind: Conditional jump or move depends on uninitialised value(s) 
} 

所以,這斷言導致Valgrind的錯誤,但我不太清楚這是什麼錯誤意味着,爲什麼我不可以打電話聲稱對聲明。Valgrind的:條件跳轉或移動依賴於未初始化的值(一個或多個)

'v'在斷言前被初始化,那爲什麼會導致這個錯誤呢?

預先感謝您。

+1

你不能可靠地返回一個指向這樣的局部變量的指針;該控件返回到調用函數時,該變量已被銷燬。 –

+1

@JonathanLeffler:「不可靠」?這是即時UB! –

+0

而UB是不可靠的......有時它看起來做你所期望的,並且大部分它不,特別是當你處於壓力或展示你的代碼時,或者...... –

回答

2

j已初始化,但只要非法依賴它具有任何特定值(在超出範圍時發生),就會被非法初始化。

此代碼返回一個指針j

int* g() { 
    int j = 2; 
    return &j;} 

此代碼取消引用該指針:

int v = *g(); 

j不再存在 - 它出去的作用域時g返回。您不能將指針取消引用到不再存在的變量。

+0

啊!這很清楚。非常感謝你對水晶般清晰的解釋。 – Nayana

相關問題