2013-07-18 1 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