Tôi muốn lưu trữ tham chiếu đến đối tượng dưới dạng weak_ptr. Trong tinh khiết C++, các công việc sau:boost :: python and weak_ptr: công cụ biến mất
#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;
}
biên dịch và chạy này sẽ cung cấp cho bạn điều này:
%> ./a.out
storing 0x8c6c008
ok, v has been stored
stored value : 0x8c6c008
Bây giờ, nếu tôi tóm lược rằng với tăng 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);
}
và bây giờ một tập lệnh python nhỏ để thử nó ra
from test import *
e = Empty()
st = Store()
st.set(e)
st.get()
... và kết quả là ...
storing 0x9eb2a18
ok, v has been stored
there's nothing here !
như vậy rõ ràng trong khi tôi vẫn còn trong cùng một phương pháp (setValue), không có vấn đề khi truy một shared_ptr từ Cửa hàng :: giá trị. Nhưng ngay sau khi tôi thoát khỏi bối cảnh này, không còn gì nữa!
Làm cách nào để thực hiện điều này? Là python đi qua một shared_ptr mới (và vô dụng) như là một đối số để setValue, mà sau đó bị phá hủy vào cuối cuộc gọi? Tôi bị lạc ở đây.
Hmm ... Thêm trình phá hủy vào 'Empty' để in thông báo và xem nó có bị hủy hay không. Ngoài ra, điều gì xảy ra nếu bạn lưu trữ một 'shared_ptr'? –
Đoán của tôi là ở một vị trí 'shared_ptr' dùng để chỉ' :: boost :: shared_ptr' và trong một cái khác nó đề cập đến ':: std :: shared_ptr'. Tôi rất thích sử dụng 'typedef' để lấy các tên từ các không gian tên khác nhau để có nhiều khai báo' using namespace'. – Omnifarious
Hãy nghĩ rằng nó liên quan đến điều này? http://mail.python.org/pipermail/cplusplus-sig/2009-November/014981.html – HostileFork