2017-03-31 7 views
-1

다음 함수는 객체의 데이터베이스에 포인터를 할당하여 객체의 데이터베이스에 메모리를 할당해야합니다.새로운 : 잠재적으로 초기화되지 않은 포인터 "

그러면 포인터가 포인터 연산을 사용하여 배열을 루프 다운하고 사용자 입력에 따라 각 개체를 올바른 값으로 초기화합니다. 여기

작동하지 않는 코드 :

//********************************************************************** 
//*      Get Database Records      * 
//********************************************************************** 
record* get_records_database(int quantity) 
{ 
    record *p_database; // Pointer to the records database 
    record *p_record; // Pointer to each object in the database 
    int index = 1; // Number of objects in the database 

    // Allocate a database of object records 
    try 
    { 
     p_database = new record[quantity]; 
    } 
    catch (bad_alloc xa) 
    { 
     fatal_error(ALLOC_ERR, "get_records_database", 
          "object records database"); 
    } 

    // Loop processing object records until the database is filled 
    // --- // 

    // Test: 
    p_database->set_amount(400); 
    p_database->get_amount(); 

    return p_database; 
} 

난으로 VisualStudio에서 다음 컴파일러 에러를 수정한다 당면한 문제점 : 오류 C4703 : 잠재적 초기화 로컬 포인터 변수 'p_employee_database'사용.

이것은 프로젝트입니다. new, try, catch 및 pointers를 사용하는 것이 필요합니다. 함수의 구조가 필요합니다 (이 시점에서 모두 쓰는 것은 아닙니다). 클래스에 대한 포인터의 반환 값이 필요합니다. 선생님은 자신의 요구 사항을 정확하게 따르는 데 극도로 엄격합니다.

이 오류를 해결하는 데 큰 도움이됩니다. 그러나 당신이 함수에서 반환하는 데 실패는 p_employee_database가 초기화되지, 예외가 throw되면

try 
    { 
     p_employee_database = new employee_bonus_record[employee_quantity]; 
    } 
    catch (bad_alloc xa) 
    { 
     fatal_error(EMPLOYEE_ALLOC_ERR, "get_employee_records_database", 
             "employee bonus records database"); 
    } 
    //.. rest of code, assuming p_employee_database is ok. 

: 여기에 코드 적어도 두 가지 문제가 있습니다)

+0

'fatal_error' 란 무엇이며 오류가 발생해도 오류가없는 것처럼 코드가 계속 실행되는 이유는 무엇입니까? – PaulMcKenzie

+0

@PaulMcKenzie 치명적인 오류 기능은 오류 메시지를 인쇄하고 오류 번호와 함께 종료합니다. –

+0

무엇을 종료합니까? 프로그램?? – PaulMcKenzie

답변

2

, 감사합니다. 대신 로직이 p_employee_database을 사용하여 아무 일도하지 않는 것처럼 진행되므로 컴파일러는 경고합니다.

명시된 것처럼 fatal_errorexit()이며 컴파일러에서는이 사실을 볼 수 없습니다. 그것은 그 코드 블록을보고 경고를줍니다. 경고를 표시하지 않으려면 nullptr을 반환 할 수 있습니다. 코드 문제

try 
    { 
     p_employee_database = new employee_bonus_record[employee_quantity]; 
    } 
    catch (const bad_alloc& xa) 
    { 
     fatal_error(EMPLOYEE_ALLOC_ERR, "get_employee_records_database", 
             "employee bonus records database"); 
     return nullptr; 
    } 

두 번째 것은 당신이 값이 아닌, const를 참조하여 std::bad_alloccatch해야한다는 것입니다. this article을 참조하십시오.

+0

'xa '를 참조하면 경고 C4101 :'xa ': 참조되지 않은 지역 변수 **가 표시됨에 유의하십시오. **이 문제의 중요한 이유를 확인하기 위해'try/catch' 메소드의 일반적인 형태에 대해 좀 더 살펴야 할 것입니다. –

+0

매개 변수 즉'(const std :: bad_alloc &)'를 삭제할 수 있습니다. 하지만 그 대신에,'xa.what()'이 여러분에게 말하는 것을 실제로 기록해야합니다. 시스템 오류 문자열을 완전히 무시하고 오류에 대한 독자적인 해석을 작성하는 것은 좋은 습관이 아닙니다. 하나의 큰 이유는 시스템 오류 문자열이 수천 명의 프로그래머에 의해 일관되고 발생하기 때문에 더 많은 정보를 찾기 위해 시스템 오류 문자열을 조사 (웹 검색) 할 수 있다는 것입니다. – PaulMcKenzie

+0

나는 왜이 기술을 문제없이 내 프로그램에서 두 번 사용했는지 아직도 이해할 수 없기 때문에 이것이 확실한 답을 찾지 못했습니다. 그러나 답변을 주셔서 감사합니다. 또한, 선생님은 컴파일러에 문제가있는 경우'p_employee_database = NULL; '을 사용하라고했습니다. –