我正在创建一个boost::python
包来访问python中的c ++结构。
一切正常,但boost::python
调用析构函数的行为非常烦人。
不知道boost::python
模块或python是否存在问题。
Python版本2.7
我在做什么。
struct World
{
void set(const std::string &msg) { this->msg = msg; }
const std::string &greet() const { return msg; }
std::string msg;
World() {cout<< "CONSTRUCTOR : WORLD" << endl; }
~World() { cout<< "DESTRUCTOR : WORLD " << msg << endl; }
};
struct WorldData
{
WorldData() { std::cout<< "WorldData : CONSTRUCTOR " << std::endl; my_data.clear(); }
~WorldData() { std::cout<< "WorldData : DESTRUCTOR " << std::endl; my_data.clear(); }
void append_data(const World &data) { my_data.insert(my_data.end(), data); std::cout << "Data Appended\n"; }
const vector<World> &get_data() const { return my_data; }
vector<World> my_data;
};
我已经创建了这些结构及其包。
BOOST_PYTHON_MODULE(libboopyclass)
{
boost::python::class_<World>("World", boost::python::init<>())
.def("greet", &World::greet, boost::python::return_value_policy<boost::python::copy_const_reference>())
.def("set", &World::set);
boost::python::class_<WorldData>("WorldData", boost::python::init<>())
.def("append_data", &WorldData::append_data)
.def("get_data", &WorldData::get_data, boost::python::return_value_policy<boost::python::copy_const_reference>());
}
这就是我创建python模块的方法。 并从python中调用它。
import libboopyclass
def my_module_function(input):
print 'input : ', input
print 'Python : Module function called'
world_data = libboopyclass.WorldData()
p = libboopyclass.World()
print 'LOOP START'
for i in range(0, 4):
p.set("howdaadfay : " + str(i))
world_data.append_data(p)
del p
print 'LOOP CLOSED'
return world_data
输出:
LOOP START
Data Appended
DESTRUCTOR : WORLD howdaadfay : 0 // Why this destructor called
Data Appended
DESTRUCTOR : WORLD howdaadfay : 0 // Why this destructor called
DESTRUCTOR : WORLD howdaadfay : 1 // Why this destructor called
Data Appended
Data Appended
DESTRUCTOR : WORLD howdaadfay : 3 // This destructor called when variable goes out of scope
LOOP CLOSED
WorldData : DESTRUCTOR
DESTRUCTOR : WORLD howdaadfay : 0
DESTRUCTOR : WORLD howdaadfay : 1
DESTRUCTOR : WORLD howdaadfay : 2
DESTRUCTOR : WORLD howdaadfay : 3
这是析构函数的问题。 为什么他们被召唤并且称这些破坏者为谁。 但是,如果我使用c ++代码做同样的事情。一切正常。变量超出范围时调用的所有析构函数。