Tengo esto en mi código:

double** desc = new double* [size_out];
for (int i = 0; i < size_out; i++)
    desc[i] = new double [size_in];

¿Cómo puedo eliminar este desc?

Debo hacer:

delete [] desc;

o

for (int i=0; i<size_out; i++)
    delete [] desc[i];
delete [] desc;

o

for (int i=0; i<size_out; i++)
    delete [] desc[i];
delete desc;

?

InformationsquelleAutor yelo3 | 2010-11-16

5 Comentarios

  1. 21

    Reglas simples a seguir:

    • para cada asignación, no tiene que ser un desasignación (ex1 es, por tanto, incorrecto)
    • lo que fue asignada usando new debe ser liberado usando delete, utilizando new[] debe cancelar la asignación de uso de delete[] y el uso de malloc debe cancelar la asignación de uso de free (ex3 es, por tanto, incorrecto)

    Conclusión, ex2 es ACEPTAR.

  2. 21

    El código no compila. El tipo de una matriz nueva expresión es un puntero al tipo de elemento de la matriz que está siendo creado (el valor es un puntero al primer elemento de ese array).

    Por lo que el tipo de new double**[size_out] es double ***.

    Siempre que usted use el formulario de matriz de nuevo, usted debe utilizar la matriz de la forma de eliminar incluso si usted sólo asignar una matriz de tamaño uno.

    double*** desc = new double**[size_out];
    for (int i=0; i<size_out; i++)
        desc[i] = new double*[size_in];
    
    
    for (int i=0; i<size_out; i++)
        delete[] desc[i];
    
    delete[] desc;

    Nota que aún no se ha asignado ningún double, sólo los punteros.

    ¿De verdad quieres esta vez?

    double** desc = new double*[size_out];
    for (int i=0; i<size_out; i++)
        desc[i] = new double[size_in];
    
    for (int i=0; i<size_out; i++)
        delete[] desc[i];
    
    delete[] desc;
    • +1 para señalar el tipo de problema de falta de coincidencia
  3. 18

    Su eliminación debe ser un espejo de su asignación.

    Puesto que usted utiliza new [] para asignar el exterior de la matriz, y new [] (en bucle) para asignar el interior de las matrices, hacer lo mismo para su eliminación. Que es: la segunda solución es correcta; delete [] el interior de las matrices en un bucle, y finalmente el exterior de la matriz a través de delete [] también.

    Que dijo, un (mucho, mucho), la mejor solución en C++ sería el uso de un anidada std::vector:

    //Declaration and initialization:
    vector<vector<double> > desc(size_out, vector<double>(size_in));
    
    //No deletion!
    • +1 para el vector solución.
    • Gracias, pero por desgracia tengo que usar esta doble**
  4. 6

    Solución 2 es la correcta : cada celda puntos para una asignación dinámica de la matriz que se debe eliminar el uso de delete[]. Finalmente,
    el desc propia matriz debe ser eliminado mediante delete[].

    Bono de solución 4 : evitar el uso de matrices y cambiar a std::vector<std::vector<double> >.

  5. 5

    Yo haría

    for (int i=0; i<size_out; i++)
        delete [] desc[i];
    delete [] desc;

    para cada matriz asignados con new [], tiene un correspondiente delete [].

    Y como Rupdolph dice: deje de usar C-matrices, y empezar a usar std::vector. Usted tendrá menos errores (cien veces menos errores).

Dejar respuesta

Please enter your comment!
Please enter your name here