2009-05-15 30 views
7
#include <boost/ptr_container/ptr_vector.hpp> 
#include <iostream> 

using namespace std; 
using namespace boost; 

struct A { 
    ~A() { cout << "deleted " << (void*)this << endl; } 
}; 

int main() { 
    ptr_vector<A> v; 
    v.push_back(new A); 
    A *temp = &v.front(); 
    v.release(v.begin()); 
    delete temp; 
    return 0; 
} 

salidas:¿Cómo transfieres la propiedad de un elemento de boost :: ptr_vector?

deleted 0x300300 
deleted 0x300300 
c(6832) malloc: *** error for object 0x300300: double free 

Respuesta

15

ptr_vector<A>::release devuelve un ptr_vector<A>::auto_type, que es una especie de ligero puntero inteligente en que cuando un elemento auto_type sale del ámbito, lo que apunta a que es borrado automáticamente Para recuperar un puntero prima a la cosa, y evitar que sean borrados por el auto_ptr que la sostiene, es necesario llamar a release en eso también:

int main() { 
    ptr_vector<A> v; 
    v.push_back(new A); 
    A *temp=v.release(v.begin()).release(); 
    delete temp; 
    return 0; 
} 

La primera release cuenta la ptr_vector a renunciar a ella; el segundo le dice al auto_ptr que lo abandone también.

+0

Bien explicado, gracias. –

Cuestiones relacionadas