2013-05-21 3 views
0

Мне нужно устранить ошибку, которую собирает компилятор - я понимаю, почему она набирает эту ошибку, но ее нужно разрешить, поскольку функция (сброс ошибки) будет выполняться только тогда, когда указатель is инициализирован.Устранение ошибки компилятора: указатель потенциально неинициализирован

Вот мой псевдо-код:

if (incoming_message_exists) 
{ 
    msg_class* current_msg; 

    /*current_msg will become either value_1 or value_2*/ 

    /*code block 1*/ 
    if (condition_is_fulfilled) 
    { 
     current_msg = value_1; 
    } 

    /*code block 2*/ 
    else 
    { 
     current_msg = value_2; 
    } 

    /*code block 3*/ 
    /*bool function performed on current_msg that is throwing error*/ 
    if (function(current_msg)) 
    { 
     //carry out function 
    } 
} 

Я предпочел бы, чтобы не выполнять блок кода 3 в 1 и 2, но если это единственное решение, то я буду. Заранее спасибо!

+0

Initalize current_msg с NULL (или null_ptr в C++ 11) – Xale

+3

Какой глупый компилятор это? Вы присваиваете значение 'msg_class' в обеих ветвях оператора' if' ... Оно не может ** возможно ** быть неинициализированным ... –

+1

@ H2CO3 Если блок 'else if' не отображается там, где он не является задавать. –

ответ

5

Являются ли if и else отраслями, которые вы нам показываете, из двух разных заявлений if?

Если это так, ваш текущий код способен оставить current_msg неинициализированным. Вероятно, это сбой, когда вы достигнете function(current_msg).

Если вы показали нам две ветки для одного и того же заявления if, ваш компилятор ошибочен - нет опасности, что current_msg не инициализируется. Однако вам может потребоваться изменить код, чтобы подавить предупреждение, скажем, если вы создаете с предупреждениями как ошибки.

Вы можете исправить/подавить предупреждение просто инициализацией current_msg, когда он объявлен

msg_class* current_msg = NULL; 

Если у вас нет другого кода в любой отрасли, вы можете также инициализируется с трехзначным оператором

msg_class* current_msg = condition_is_fulfilled? value_1 : value_2; 

Если предупреждение было подлинным, вам также необходимо либо проверить, что function справляется с переданным аргументом NULL, либо защитой от этого

if (current_msg != NULL && function(current_msg)) 
+0

«Ваш текущий код выглядит способным оставить current_msg uninitialised» - не совсем. Он назначается в обеих ветвях оператора 'if'. –

+0

'nullptr' также можно было бы предложить вместо простого' NULL' – JBL

+0

@ H2CO3. В соответствии с моим комментарием к вопросу, я подумал, что комментарий в коде// code code 2 */'предположил, что нам показывают две ветви из разных' if 'утверждения. Я изменю свой ответ, чтобы объяснить это. – simonc

Смежные вопросы