你如何转移boost :: ptr_vector元素的所有权?

Nei*_*l G 7 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;
}
Run Code Online (Sandbox Code Playgroud)

输出:

deleted 0x300300
deleted 0x300300
c(6832) malloc: *** error for object 0x300300: double free
Run Code Online (Sandbox Code Playgroud)

Hea*_*eek 15

ptr_vector<A>::release返回a 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;
}
Run Code Online (Sandbox Code Playgroud)

第一个release告诉ptr_vector他放弃; 第二个告诉auto_ptr它也放弃了.