2
class vertice{
public:
    int id;
    int juntadoCon = -1;
    ~vertice() {}
};

class grafoKarger{
private:
    int nv;
    vertice **vertices;
public:
grafoKarger(int v, int a, int m){
        nV = v; nA = a; max = m;
        aristas = new arista[a];
        vertices = new vertice*[v];
        for(int i = 0; i < v; ++i){vertices[i] = nullptr;}
        srand(static_cast<unsigned int>(clock()));
    }
   ~grafoKarger(){
        for(int i = 0; i < nV; ++i){
            if(vertices[i] != nullptr){
                delete vertices[i];
            }
        }
        delete []vertices;
    }
};

El destructor no está funcionando con **vertices (vector de punteros, no matriz) Para eliminar por ejemplo *clase, un simple delete []puntero me vale, pero aquí he probado tanto en el bucle delete vertices[i] como delete []vertices[i] y nada Actualizado con el contructor Qué estoy haciendo mal?

karny1998
  • 23
  • 3

1 Answers1

6

Qué estoy haciendo mal?

Al menos, dos cosas.


El operador delete[] se debe usar en conjunción con el operador new[]. Da igual el tipo de puntero en que guardes la memoria, si no la pediste con new[] no la deberás borrar con delete[]; así que la primera cosa que has hecho mal es no mostrar el código en que pides memoria… si no sabemos cómo la pides no sabremos cómo deberás borrarla.

La segunda cosa que has hecho mal es publicar un código que no compila. En el bucle de grafoKarger::~grafoKarger estás usando la variable nV como indizadora pero dicha variable no existe, posiblemente pretendías usar la varible int grafoKarger::nv.

Mi consejo es que te olvides de punteros, new y delete, en C++ moderno son (en la mayoría de casos) innecesarios. Si quieres una formación de objetos vertice, usa un std::vector:

class grafoKarger{
private:
    int nv;
    std::vector<vertice> vertices;
};

El propio objeto std::vector se ocupará de la gestión de memoria, no necesitarás gestionarla a mano. Además si vertice no gestiona recursos, no necesitará destructor, y si todos los miembros son públicos, puede ser una struct:

struct vertice{
    int id;
    int juntadoCon = -1;
};
PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82
  • Muchísimas gracias por tu respuesta, y perdona que no realizase bien la consulta, es la primera que he hecho Tendré en cuenta lo que me has dicho para la próxima Finalmente lo he conseguido solucionar Sobre lo de usar vector, es que es necesitaba los accesos constantes de un tipo de dato estático, y sino me equivoco, vector es una estructura dinámica que tiene coste de acceso lineal. – karny1998 Jan 07 '20 at 19:24
  • `std::vector` no es una estructura dinámica, es un contenedor de datos. La particularidad de `std::vector` es que la inserción de datos es lenta y el acceso a datos es rápido. Echa un vistazo a [este hilo](https://es.stackoverflow.com/a/54181/2742) para tener una guía sobre qué contenedor de datos escoger según tus necesidades. – PaperBirdMaster Jan 08 '20 at 08:34