Я хотел бы сохранить ссылку на объект как weak_ptr. В чистом C ++ работает следующее:
#include <iostream>
#include <boost/shared_ptr.hpp>
#include <boost/weak_ptr.hpp>
using namespace std;
using namespace boost;
struct Empty
{
Empty(){}
};
struct Store
{
weak_ptr<Empty> value;
Store(){};
void setValue(shared_ptr<Empty> v) {
cout << "storing " << v << endl;
this->value = weak_ptr<Empty>(v);
shared_ptr<Empty> v_ok = this->value.lock();
if (v_ok) {
cout << "ok, v has been stored" << endl;
}
}
shared_ptr<Empty> getValue() {
shared_ptr<Empty> p = this->value.lock();
if (p) {
cout << "stored value : " << p << endl;
} else {
cout << "there's nothing here !" << endl;
}
return p;
}
};
int main()
{
shared_ptr<Empty> e(new Empty);
shared_ptr<Store> st(new Store);
st->setValue(e);
st->getValue();
return 0;
}
компиляция и запуск этого даст вам следующее:
%> ./a.out
storing 0x8c6c008
ok, v has been stored
stored value : 0x8c6c008
Теперь, если я инкапсулирую это с помощью boost python:
#include <iostream>
#include <boost/shared_ptr.hpp>
#include <boost/python.hpp>
#include <boost/weak_ptr.hpp>
using namespace std;
using namespace boost;
using namespace boost::python;
struct Empty
{
Empty(){}
};
struct Store
{
weak_ptr<Empty> value;
Store(){};
void setValue(shared_ptr<Empty> v) {
cout << "storing " << v << endl;
this->value = weak_ptr<Empty>(v);
shared_ptr<Empty> v_ok = this->value.lock();
if (v_ok) {
cout << "ok, v has been stored" << endl;
}
}
shared_ptr<Empty> getValue() {
shared_ptr<Empty> p = this->value.lock();
if (p) {
cout << "stored value : " << p << endl;
} else {
cout << "there's nothing here !" << endl;
}
return p;
}
};
BOOST_PYTHON_MODULE (test)
{
class_< Empty, shared_ptr<Empty> >("Empty");
class_< Store, shared_ptr<Store> >("Store")
.def("get",&Store::getValue)
.def("set",&Store::setValue);
}
и теперь небольшой скрипт python, чтобы опробовать его
from test import *
e = Empty()
st = Store()
st.set(e)
st.get()
. .. и результат ...
storing 0x9eb2a18
ok, v has been stored
there's nothing here !
так что очевидно, что пока я все еще использую тот же метод (setValue), нет проблем с получением shared_ptr из Store :: value. Но как только я выхожу из этого контекста, ничего не остается!
Как такое может быть? Передает ли python совершенно новый (и бесполезный) shared_ptr в качестве аргумента для setValue, который затем уничтожается в конце вызова? Я здесь заблудился.