Pregunta

Estoy teniendo un problema cuando se ejecuta libre (posición).

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;
}

El mensaje de error completo que recibo de VS2010 es daño de montón detectada: después de bloque normal (# 64) en 0x00031390. CRT detecta que la aplicación escribe a la memoria después del final del montón.

El depurador dice que el problema se produce mientras que en en: 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 }

I intentado fijar la misma situación con menos cosas que están pasando para ver si podía reducir el problema de abajo.

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

Este es el mismo que anteriormente, sin el bucle y bucle while. Esto funciona. Extracción del bucle for es lo que hace que funcione. No sé por qué. Miré lo que el CRT era pero era bastante todos los nuevos conceptos para mí y supongo que puedo solucionar este problema sin necesidad de conocer estos tubos de rayos catódicos.

Los cesionarios de bucle valores a la memoria asignada para la posición, más allá de que no puedo pensar en por qué esto causa un problema .... En realidad, ahora que lo pienso. He cambiado el bucle a ser altura + 1 que fija el problema.

¿Fue útil?

Solución

Debe ser:

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

o

position = malloc(hieght * sizeof *position);

Es un comportamiento no definido de la manera que lo tienes. Probablemente se esté recibiendo solo suerte porque int y int* son del mismo tamaño.

Y la forma típica correcta de escribir el bucle es:

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

También puede utilizar calloc aquí:

position = calloc(hieght, sizeof *position);

y la memoria será puesto a cero para usted, por lo que no tiene que bucle.

Además, si esto es realmente C, el elenco es superflua.

Otros consejos

Creo que el problema en el bucle es el <= que en realidad debería ser <. En consecuencia, el bucle que pasa el tiempo una ronda demasiados y corrompe el siguiente elemento en el montón!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top