2014-04-28 6 views
-2

나는 수업을위한 보드 게임을 만들고있다. 각 이동을 노드로 전달하고 사용자가 u를 누르면 시작 상태가 될 때까지 보드를 실행 취소해야합니다. 보드를 한 번 이상 실행 취소하려고하면 포인터가 해제됩니다 (포인터가 해제 됨으로 할당되지 않음)? 아무도 내가이 오류 메시지를 해결할 수있는 아이디어가 있습니까? 당신이 malloc()으로 할당 할 경우해제 된 포인터가 C++에 할당되지 않았습니까?

state * removeState(state * head, int *board, int boardSize, int move, int score){ 
    state * newState = (state *)malloc(sizeof(state)); 
    newState->board = (int*)malloc(sizeof(int) * (boardSize * boardSize)); 
    if(head->next == NULL) { 
     printf("Can't undo past the beginning of the game. Enter 'c' to continue: "); 
     char c; 
     scanf(" %c", &c); // now pause the output 

    } 
    if(head->next!= NULL){ 

    newState = head; 
    head = head->next; 
    delete(newState); // THIS CAUSES THE ERROR MESSEGE IF I UNDO MORE THAN ONCE! 


    for(int row=0; row<boardSize; row++) { 
     for(int col=0; col<boardSize; col++) { 
      int current = row*boardSize + col; // 1-d index corresponding to row & col 
      board[current]= head->board[current]; 
     } 
    } 

    score = newState->score; 
    //move = newState ->move; 
    printf("Working! \n"); 

    } 
    return newState; 
} 
+3

이 태그는'C++'로 태그를 붙였습니다. 그러나 내가보기에 그것들은 많은 실수로 'C'입니다. – PaulMcKenzie

+0

왜 C++에서'malloc','printf'를 사용하고 있습니까? 왜이 물건에 STL을 사용하지 않습니까? –

+0

첫째, 왜 C++ 프로그램에서 malloc()을 사용하고 있습니까? 뿐만 아니라, malloc()을 C++'delete' 연산자와 혼합했습니다. 한 걸음 물러서서'std :: vector'가하는 일을 배우십시오. 문제가 실질적으로 사라지게 할 것입니다. – PaulMcKenzie

답변

1

free()를 사용하여 할당을 취소 할 수 있습니다. 따라서 malloc으로 할당 된 메모리에 delete을 발급하면 정의되지 않은 동작이 발생합니다.

둘째,이 같은 조건 메모리 할당을 해제 시작할 때마다 :

if(head->next!= NULL){ 
    newState = head; 
    head = head->next; 
    delete(newState); // 
} 

는이 코드가 어떤 시점에서 무너 뜨리는 것이라고 내기를 배치 할 수 있습니다. 이제 작성 또는 알아 내려고 시도 "스파게티 같은"코드가 포인터가, 그것을 삭제하지 않을 경우, 삭제 될 때 쓸 것 등

그런 다음 함수의 끝에서이 작업을 수행 :

return newState; 

지금은 newState이 유효합니까? 당신이 알고 있던 메모리를 삭제했을 수도 있기 때문에 당신은 모른다. 그리고 다시, 당신은이 딜레마를 바로 잡으려고하는 모든 종류의 왜곡을하는 코드를 작성하려고 시도 할 것입니다.

이와 같이 코딩을 최소화하거나 완전히 제거하고 스마트 포인터 클래스 또는 메모리 정리시기를 알고있는 다른 RAII 포인터 유형을 사용해야합니다.

+0

또한이 코드에서 알지 못하는 POD가 아닌 경우 '상태'를 malloc하는 것은 유효하지 않습니다. –

관련 문제