Pregunta

Estoy escribiendo una simulación para la clase, y parte de ella consiste en la reproducción de los organismos. Mis organismos se mantienen en una matriz, y tengo que aumentar el tamaño de la matriz cuando se reproducen. Debido a que tengo varias clases de múltiples organismos, que utiliza una plantilla:

template <class orgType>
void expandarray(orgType* oldarray, int& numitems, int reproductioncount)
{
    orgType *newarray = new orgType[numitems+reproductioncount];

    for (int i=0; i<numitems; i++) {
        newarray[i] = oldarray[i];
    }

    numitems += reproductioncount;

    delete[] oldarray;
    oldarray = newarray;
    newarray = NULL;
}

Sin embargo, esta plantilla parece estar de alguna manera corrompiendo mis datos. Puedo ejecutar el programa bien sin la reproducción (comentando las llamadas a expandarray), pero llamar a esta función hace que mi programa se bloquee. El programa no se bloquea durante la función de expandarray, pero se estrella en violación de acceso más adelante.

He escrito funciones para expandir un array cientos de veces, y no tengo ni idea de lo que la pata esta vez. ¿Hay algo descaradamente mal en mi función? ¿Se ve bien a usted?

EDIT: Gracias por la ayuda de todos. No puedo creer que me haya perdido algo tan obvio. En respuesta a la utilización de std::vector: no hemos discutido en clase, sin embargo, y tan tonto como parece, tengo que escribir código usando los métodos que nos han enseñado

.
¿Fue útil?

Solución

Tiene que pasar oldarray como referencia: orgType *& oldarray. La forma en que está escrito actualmente, la función delete tabla de la persona que llama, pero no lo dará el recién asignado, causando el accidente.

Mejor aún, el uso std::vector en lugar de reimplementar la misma.

Otros consejos

La biblioteca estándar de C ++ ya ha escrito funcionalidad para hacer esto.

El uso del contenedor std::vector.

Parece que está modificando el puntero oldarray a punto de la nueva matriz, pero recuerdo que en la función que es sólo una copia y no afectará a la variable que se ha pasado. Es probable que tenga que pasar una referencia a un puntero si querer hacerlo de esta manera.

Y, en efecto, std :: vector hace esto para usted de todos modos

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