Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do you transfer ownership of an element of boost::ptr_vector?

Tags:

c++

boost

#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
like image 754
Neil G Avatar asked May 15 '09 23:05

Neil G


1 Answers

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.

like image 113
Head Geek Avatar answered Sep 19 '22 18:09

Head Geek