tags:

views:

317

answers:

1
#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;
}

outputs:

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

ptr_vector<A>::release returns a ptr_vector<A>::auto_type, which is a kind of light-weight smart pointer in that when an auto_type item goes out of scope, the thing it points to is automatically deleted. To recover a raw pointer to the thing, and keep it from being deleted by the auto_ptr that's holding it, you need to call release on that too:

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

The first release tells the ptr_vector to give it up; the second tells the auto_ptr to give it up too.

Head Geek
Well-explained, thanks.
Neil G