2010-11-26 2 views
2

무료 (위치)를 실행할 때 문제가 있습니다.C/C++에서 malloc과 free를 사용하고 오류가 발생했습니다. HEAP CORRUPTION DETECTED

void printTree(nodeT node, int hieght) 
{ 
    int *position; 
    position = (int*)malloc(hieght * sizeof(int*)); 
    for (int i = 0; i <= hieght; i++) 
    { 
     position[i] = 0; 
    } 
    BOOLEAN DONE = FALSE; 
    while (DONE == FALSE) 
    { 
     printMoveDown(&node, position); 
     printLEAFNode(&node, position); 
     DONE = printMoveUp(&node, position); 
     printSingleKey(&node, position); 
    } 
    free(position); 
    position = NULL; 
} 

내가 VS2010에서 얻을 전체 오류 메시지가 감지 힙 손상이 : 0x00031390에서 정상 블록 (# 64) 후. CRT는 응용 프로그램이 힙 종료 후에 메모리에 쓴 것을 감지했습니다. 내가 적은 물건은 내가 문제를 좁힐 수 있는지에가는 같은 상황을 설정하려고 dbgheap.c

extern "C" void __cdecl _free_dbg_nolock 
line 1376: if (!CheckBytes(pbData(pHead) + pHead->nDataSize, _bNoMansLandFill, nNoMansLandSize)) 
       if (pHead->szFileName) {..} 
       else { this is where the program stops } 

:

디버거에서에서 동안 문제가 발생했다.

void function (int y) 
{ 
    int *x; 
    x = (int*)malloc(y * sizeof(int*)); 
    free(x); 
    x = NULL; 
} 

for 루프 및 while 루프가없는 경우와 같습니다. 이 작동합니다. for 루프를 제거하면 작동하게됩니다. 나는 이유를 모른다. 나는 CRT가 무엇인지 보았다. 그러나 그것은 나에게 꽤 새로운 개념이었고, 나는이 CRT에 대해 알지 못해도이 문제를 해결할 수 있다고 가정한다.

for 루프는 위치를 위해 할당 된 메모리에 값을 할당합니다. 그 이유는 왜 이것이 문제를 일으키는 지 생각할 수 없습니다. 실제로 생각해보십시오. 루프를 높이 + 1로 변경하여 문제를 해결했습니다.

답변

3

그것은해야한다 :

position = malloc(hieght * sizeof(int)); 

나 :

position = malloc(hieght * sizeof *position); 

그건 정의되지 않은 동작 당신이 그것을 가지고있는 방법입니다. intint*이 같은 크기이기 때문에 아마 운이 좋을 것입니다.

그리고 루프를 작성하는 전형적인 올바른 방법은 다음과 같습니다

for (int i = 0; i < hieght; i++) 
{ 
    position[i] = 0; 
} 

또한 이곳은 calloc 사용할 수 있습니다

position = calloc(hieght, sizeof *position); 

를 메모리 당신을 위해 제로 될 것이다, 그래서 당신은하지 않습니다 반복해야합니다.

또한 이것이 실제로 C이면 캐스트가 불필요합니다.

+0

감사합니다. calloc을 사용하여 주셔서 감사합니다. 일관성을 위해 <= in 루프를 사용하는 것을 피하려고합니다. 나는 내가 가지고있는 문제들 때문에 그것을 바꿨다고 생각한다. – MykC

+1

실로, 당신의 답은 OP의 코드에서 추악하고 잠재적으로 해로운 캐스트를 제거해야합니다. –

+0

@ R, 좋은 제안입니다. 제목은 C/C++라고했지만 질문은 C라고 했으므로 제거했습니다. –

0

루프의 문제는 < =이게 실제로 <이되어야한다고 생각합니다. 결과적으로 루프가 너무 많이 돌아서 힙의 다음 항목이 손상됩니다!

+1

이것은 거의 4 년 전에 받아 들여진 대답에서 이미 지적되었습니다. –

관련 문제