2013-08-09 2 views
-1

위대한 사이트 .. 내 프로그램에서이 오류가 발생하며 포인터 유형을 sturct 할 때 발생합니다. 이유는 이해할 수 있지만 .. 포인터가 전역 적으로 선언된다는 사실과 관련이 있다고 생각하십시오. 도움을 주셔서 감사합니다.힙 손상 감지 : 정상 차단 후 (# 143)

* "prev", "current"및 "head"는 전역이며 malloc()을 사용하여 다른 함수에 할당됩니다.

코드 :

void approve_delete(int* delete_request){ 
    if(*delete_request == 0){ 
     cout<<" there are no more delet requests\n"; 
     return; 
    } 
    char choice[5]; 
    char ch; 

    current = head; 
    Prev = head; 
    while (current->user.id != MAX_ID){ 
     if(current->user.want_delete == true){ 
      cout<<"name : "<<current->user.name<<" "<<current->user.last_name<<" id: "<<current->user.id<<endl; 
      ch=0; 
      while(ch != 'y' && ch != 'Y' && ch != 'n' && ch != 'N') { 
       cout<<"approve delete? Y/N or (Q)exit\n"; 
       cin.width(5); 
       cin>>choice; 
       ch=choice[0]; 
       switch (ch) { 
       case 'y': 
       case 'Y': 
        item* Temp = current; 
        Prev->next = Prev-> next->next; 
        current=Prev->next; 
        free(Temp);  //here the error occur! 
        cout<<"in"; 
        *delete_request -= 1; 
        cout<<"student deleted\n"; 
        break; 
       case 'n': 
       case 'N': 
        break; 
       case 'q': 
       case 'Q': 
        return; 
       } 
      } 
     } 
     Prev = current; 
     current = current->next; 
    } 
} 
+0

디버깅 해 보셨습니까? –

+0

예, 런타임 오류입니다. 그리고 힙 버퍼의 끝 후에 메모리에 쓰려고하는 메시지가 표시됩니다. –

+0

결론은 무엇입니까? – Devolus

답변

0

오류는 코드의 다른 부분에서 비롯된 것입니다. 전체 코드 (개인적으로 그에게 말한 것)를 살펴본 후 유형 불일치로 인해 문제가 발생했습니다.

'항목은'(회원 bool 형식으로되어 마지막에) 두 개의 부울 회원이 구조체이다. 구조체를 데이터로 채우는 함수는 파일의 데이터를 사용합니다. 파일에서 읽으려면 fscanf()를 사용하고 "% d % d"을 사용하여 숫자 값을 읽음으로써 부울 멤버에 대한 데이터를 가져 왔습니다. 정수는 부울보다 많은 메모리를 차지하므로 힙이 손상됩니다.

+0

당신은 남자 야! –

-1

대부분의 아마, 당신이있어 '현재'노드는 널 포인터가 메모리 예외가 발생 참조를 해제하려고 null입니다.

  1. u가 현재 객체가 null이 아니라고 추측 할 수있는 노드의 값을 인쇄 해보십시오.이 경우 노드가 작동하지 않는 이유가 없습니다.

PS : 항상 유 동적으로 생성 된 객체에 사용하기 전에,이 도움이

   if(temp!=null){ 
       free(temp); 
       } 

희망 같은 것을 확인에 '널'을 할.

감사합니다, 시바 샨 카르

+1

'current'가'NULL' 포인터 인 경우 오른쪽 화살표 피연산자가 유효하지 않으므로 루프에 들어갈 수 없습니다. –

+0

C 표준은'free (NULL));와 같은 호출을 명시 적으로 허용합니다. – alk

1

는의 코드 및 디버그 그 다음 줄 살펴 보자.

1. item* Temp = current; 
2. Prev->next = Prev-> next->next; 
3. current=Prev->next; 
4. free(Temp); 

첫 번째 라인은 (우리에게 알 수없는)을 item에 대한 포인터 Temp을 정의하고 현재 item를 가리 키도록 초기화됩니다. 물론 작동합니다.

두 번째 라인은 nextitem이고 Prev은 세 번째가 item이되도록 지정합니다. 하지만, 두 번째는 어떻게됩니까 item? 어디 갔지? 이것은 바로 여기 메모리 누수입니다.

세 번째 줄은 위의 설명대로 세 번째 item을 가리 키도록 current을 할당합니다. 아직도 두 번째 item이 어디로 갔는지 모르겠다.

마지막으로 네 번째 줄은 Temp을 해제합니다. 물론, 그걸로 잘못된 것은 아니지만 나는 아직도 두 번째 item가 어디에서 혼란스러워합니까?

아무런 것도 item을 가리 키지 않으므로 해당 코드 조각의 2 행에 메모리 누수가 있습니다. 따라서 item에 할당 된 메모리 블록을 해제 할 수 없습니다.

+0

안녕하세요 jacob, 이것은이 함수에 대한 주어진 연결 목록입니다. 순서는 다음과 같습니다 : 이전 - 현재 - 다른 노드 ... 현재를 삭제하려고합니다. 그게 내가 prev-> 다음에 prev-> next-> next (존재합니다 ..)와 cuurent를 우회하는 것입니다. 그런 다음 무료 전류 (온도를 사용하여) –

+0

@ 벤처,하지만 그건 내 분석에서 언급 한대로 잘못되었습니다. 초기에'current'와'Prev'는 첫번째 노드 (머리)를 가리 킵니다. 그런 다음 헤드를 가리키는 백업 포인터를 만들고 있습니다. 그런 다음 헤드 노드가 더 이상 다음 노드 (두 번째 노드)를 가리 키지 않아야하고 다음 노드 (세 번째 노드)를 가리켜 야한다고 말합니다. 2 번 줄에서 더 이상 두 번째 노드를 가리키는 아무 것도 없으며 메모리 누수가 발생합니다. –

+0

왜 안 되니? 두 번째 노드는 현재이고 임시 .. –

0

무료 전에 어느 시점에서 당신은 당신의 것이 아닌 기억에 썼습니다. 아마도 malloc으로 할당 된 배열의 범위를 벗어난 인덱스에 액세스했을 수도 있습니다. 아마도 이미 풀어 놓은 메모리에 액세스했을 것입니다. 원인에 관계없이 이러한 문제는 디버그하기가 어려울 수 있습니다.

Windows를 사용 중이므로 pageheap tool이 도움이 될 수 있지만 사용해 본적이 없으므로 도움을받을 수 없습니다.

또한 Jacob은 첫 번째 항목을 삭제하려고하면 코드가 손상되는 것에 대해 옳습니다.