Как вы передаете право собственности на элемент boost :: ptr_vector? - PullRequest
7 голосов
/ 16 мая 2009
#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;
}

выходы:

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

1 Ответ

15 голосов
/ 16 мая 2009

ptr_vector<A>::release возвращает ptr_vector<A>::auto_type, что является своего рода легким интеллектуальным указателем в том смысле, что когда элемент auto_type выходит из области видимости, объект, на который он указывает, автоматически удаляется. Чтобы восстановить необработанный указатель на объект и предотвратить его удаление с помощью auto_ptr, который его удерживает, вам также необходимо вызвать release для этого:

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

Первый release говорит ptr_vector отказаться от него; второй приказывает auto_ptr также отказаться от него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...