Tôi đang cố gắng lưu trữ các đối tượng trong tập hợp :: std. Các đối tượng đó được tăng cường :: shared_ptr <>, đến từ môi trường python. thêm giá trị vào tập hợp sẽ không gây ra bất kỳ sự cố nào. Nhưng khi tôi cố gắng xóa một giá trị, mặc dù tôi đi qua cùng một tham chiếu, nó sẽ không hoạt động. Dưới đây là một ví dụ:boost :: python and set :: erase -> hành vi lạ
#include <set>
#include <iostream>
#include <boost/shared_ptr.hpp>
#include <boost/python.hpp>
using namespace std;
using namespace boost;
using namespace boost::python;
struct Bar
{
Bar() {}
};
struct Foo
{
set< shared_ptr<Bar> > v_set;
shared_ptr<Bar> v_ptr;
Foo() {}
void add(shared_ptr<Bar> v_param) {
cout << "storing " << v_param << "in v_set and v_ptr" << endl;
v_set.insert(v_param);
v_ptr = v_param;
}
void del(shared_ptr<Bar> v_param) {
cout << "deleting " << v_param << endl;
if (v_param == v_ptr) {
cout << "v_param == v_ptr" << endl;
} else {
cout << "v_param != v_ptr" << endl;
}
cout << "erasing from v_set using v_param" << endl;
if (v_set.erase(v_param) == 0) {
cout << "didn't erase anything" << endl;
} else {
cout << "erased !" << endl;
}
cout << "erasing from v_set using v_ptr" << endl;
if (v_set.erase(v_ptr) == 0) {
cout << "didn't erase anything" << endl;
} else {
cout << "erased !" << endl;
}
}
};
BOOST_PYTHON_MODULE (test)
{
class_< Foo, shared_ptr<Foo> >("Foo")
.def("add",&Foo::add)
.def("remove",&Foo::del);
class_< Bar, shared_ptr<Bar> >("Bar");
}
biên dịch:
%> gcc -pthread -fno-strict-aliasing -march=i686 -mtune=generic -O2 -pipe -DNDEBUG -march=i686 -mtune=generic -O2 -pipe -fPIC -I/usr/include/python2.7 -c test.cpp -o test.o
%> g++ -pthread -shared -Wl,--hash-style=gnu -Wl,--as-needed build/temp.linux-i686-2.7/test.o -L/usr/lib -lboost_python -lpython2.7 -o test.so
và bây giờ, một kịch bản python nhỏ:
from test import *
f = Foo()
b = Bar()
f.add(b)
f.remove(b)
Đây là kết quả:
storing 0x8c8bc58in v_set and v_ptr
deleting 0x8c8bc58
v_param == v_ptr
erasing from v_set using v_param
didn't erase anything
erasing from v_set using v_ptr
erased !
- tôi lưu trữ 0x8e89c58 bên trong các thiết lập và bên ngoài, chỉ trong trường hợp
- Tôi đang đi qua các tài liệu tham khảo cùng với cả cuộc gọi (0x8e89c58)
- chỉ để chắc chắn tôi kiểm tra nếu v == val
- tôi cố gắng xóa bằng cách sử dụng v - nó không hoạt động
- Tôi cố gắng xóa bằng cách sử dụng val - nó hoạt động!
Tôi hoàn toàn bị mất ở đó - không thể xem điều gì đang gây ra điều này. Bất kỳ đầu vào?
Việc bạn sử dụng của "value" "val" và "v" tất cả các tên biến trong cùng một hàm làm cho mã của bạn không cần thiết phải làm theo. –
thực sự, xin lỗi vì điều đó. Tôi hy vọng nó rõ ràng hơn bây giờ. – girodt