2010-09-16 151 views
3

考虑以下的Python的ctypes - C++结合:的Python ctypes的,C++对象的破坏

// C++ 
class A 
{ 
public: 
    void someFunc(); 
}; 

A* A_new() { return new A(); } 
void A_someFunc(A* obj) { obj->someFunc(); } 
void A_destruct(A* obj) { delete obj; } 

# python 
from ctypes import cdll 

libA = cdll.LoadLibrary(some_path) 

class A: 
    def __init__(self): 
     self.obj = libA.A_new() 

    def some_func(self): 
     libA.A_someFunc(self.obj) 

什么是删除C++对象的最好方式,当不需要Python对象了。

[编辑] 我说有人建议删除功能,但问题仍然存在由谁来当函数被调用。它应该尽可能方便。

回答

7

您可以实现的__del__方法,它调用析构函数,你必须定义:

C++

class A 
{ 
public: 
    void someFunc(); 
}; 

A* A_new() { return new A(); } 
void delete_A(A* obj) { delete obj; } 
void A_someFunc(A* obj) { obj->someFunc(); } 

的Python

from ctypes import cdll 

libA = cdll.LoadLibrary(some_path) 

class A: 
    def __init__(self): 
     self.obj = libA.A_new() 

    def __del__(self): 
     libA.delete_A(self.obj) 

    def some_func(self): 
     libA.A_someFunc(self.obj) 

还要注意,在上省略了self参数方法。

有些人认为__del__是邪恶的。作为替代方案,您可以使用with语法:

class A: 
    def __init__(self): 
     self.obj = libA.A_new() 

    def __enter__(self): 
     return self 

    def __exit__(self): 
     libA.delete_A(self.obj) 

    def some_func(self): 
     libA.A_someFunc(self.obj) 

with A() as a: 
    # Do some work 
    a.some_func() 
+0

何时调用__del__函数? – tauran 2010-09-16 08:42:58

+0

当“A”的引用计数达到零时,就在清理对象之前。 – 2010-09-16 08:44:43

+0

这种情况何时发生?在python文档中找不到它们。这是否意味着python决定何时执行__del__? – tauran 2010-09-16 08:47:56

2

一般来说,动态链接库应提供清理对象他们创建的方法。这样,内存分配被封装在dll中。这意味着,您的dll应该可能会暴露像void A_delete(A*)这样的方法。

1

出口从DLL将释放对象的函数。您必须这样做才能确保使用相同的内存管理机制释放分配对象时负责的对象。