2012-10-09 52 views
17

Supongamos que he definido una clase como esta:despejar un vector de punteros

class foo { 
private: 
    std::vector< int* > v; 
public: 
    ... 
    void bar1() 
    { 
     for (int i = 0; i < 10; i++) { 
     int *a = new int; 
     v.push_back(a); 
     } 
    }; 

    void bar2() 
    { 
     std::vector<int>::iterator it = v.begin(); 
     for (; it != v.end(); it++) 
     std::cout << (*it); 
     v.clear(); 
    } 
}; 

En resumen, hacer retroceder algunos punteros en un vector, más tarde puedo borrar el vector. La pregunta es, ¿este código tiene pérdida de memoria? Quiero decir, al borrar el vector, ¿los punteros se eliminan correctamente?

+2

En realidad empuje solamente un único puntero al vector; el '' bucle for' en bar1' sólo ejecuta el 'new int; línea' ya que no tiene las llaves, y '' i +++ es un error de sintaxis y ... ah bueno, supongo que esto está destinado a ser pseudocódigo. –

+0

@ Frerich Raabe: editado ... – mahmood

+0

También necesita un vector de punteros int: 'std :: vector < int* > v;' en lugar de 'std :: vector < int > v;' – juanchopanza

Respuesta

24

Sí, el código tiene una pérdida de memoria a menos que elimine los punteros. Si la clase foo posee los punteros, es su responsabilidad eliminarlos. Debería hacer esto antes de borrar el vector; de lo contrario, perderá el control de la memoria que necesita desasignar.

for (std::vector<int>::iterator it = v.begin() ; it != v.end(); ++it) 
    { 
    delete (*it); 
    } 
    v.clear(); 

podría evitar el problema de gestión de memoria por completo mediante el uso de un std::vector de un adecuado smart pointer.

+0

¿Puedes darme el método Straghit (no el ptr inteligente)? – mahmood

+0

@mahmood Depende de los detalles de su clase, pero es una apuesta segura que debe hacerlo justo antes de despejar el vector. Iteramos sobre él, eliminando cada elemento. * Entonces * límpialo. – juanchopanza

+0

@mahmood Agregué un ejemplo. – juanchopanza

6

Nop solo borre el almacenamiento de vectores. La memoria asignada con 'nuevo' todavía está allí.

for (int i =0; i< v.size();i++) 
    { 
    delete (v[i]); 
    } 
    v.clear(); 
+0

Entonces, ¿cómo puedo eliminar? – mahmood

+1

usa 'eliminar' en cada iteración. Después de usar el clear para borrar el vector. e, g borrar (* it) –

+0

de (auto + i: v) { borro (i); } v.clear(); es este código correcto – lsrawat

2

Puede utilizar for_each:

std::vector<int*> v; 

template<typename T> 
struct deleter : std::unary_function<const T*, void> 
{ 
    void operator() (const T *ptr) const 
    { 
    delete ptr; 
    } 
}; 

// call deleter for each element , freeing them 
std::for_each (v.begin(), v.end(), deleter<int>()); 
v.clear(); 
+0

A menudo me gustaría algo como este 'eliminador 'estaba disponible; Me pregunto, ¿podría implementarlo en términos de 'std :: mem_fun_ptr o' std: fun_ptr' más o menos? –

6

Creo que la solución más corta y la más clara sería:

std::vector<Object*> container = ... ; 
for (Object* obj : container) 
    delete obj; 
container.clear(); 
Cuestiones relacionadas