#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
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With