boost :: python意外的析构行为

时间:2014-07-08 08:56:57

标签: python c++ python-2.7 boost destructor

我正在创建一个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 ++代码做同样的事情。一切正常。变量超出范围时调用的所有析构函数。

0 个答案:

没有答案