documentation에 따르면 세 번째 인수 인 PyCapsule_New()
은 소멸자를 지정할 수 있습니다. 소멸자는 캡슐이 소멸 될 때 호출해야한다고 가정합니다. 나는 개체를 인스턴스화과 파이썬 콘솔에서 출구를 삭제할 때PyCapsule 객체 삭제
void mapDestroy(PyObject *capsule) {
lash_map_simple_t *map;
fprintf(stderr, "Entered destructor\n");
map = (lash_map_simple_t*)PyCapsule_GetPointer(capsule, "MAP_C_API");
if (map == NULL)
return;
fprintf(stderr, "Destroying map %p\n", map);
lashMapSimpleFree(map);
free(map);
}
static PyObject * mapSimpleInit_func(PyObject *self, PyObject *args) {
unsigned int w;
unsigned int h;
PyObject *pymap;
lash_map_simple_t *map = (lash_map_simple_t*)malloc(sizeof(lash_map_simple_t));
pymap = PyCapsule_New((void *)map, "MAP_C_API", mapDestroy);
if (!PyArg_ParseTuple(args, "II", &w, &h))
return NULL;
lashMapSimpleInit(map, &w, &h);
return Py_BuildValue("O", pymap);
}
그러나, 소멸자는 호출하지 않는 것 :
>>> a = mapSimpleInit(10,20)
>>> a
<capsule object "MAP_C_API" at 0x7fcf4959f930>
>>> del(a)
>>> a = mapSimpleInit(10,20)
>>> a
<capsule object "MAP_C_API" at 0x7fcf495186f0>
>>> quit()
[email protected] ~/programming/src/liblashgame $
내 생각 엔 그것은 함께 할 수있는 뭔가가 있다는 것입니다 Py_BuildValue()
은 삭제시 원본에 영향을주지 않는 "캡슐"에 대한 새 참조를 반환합니다. 어쨌든, 나는 그 물체가 적절하게 파괴되었는지 어떻게 알 수 있을까요? (리눅스에서) 파이썬 3.4.3 [GCC 4.8.4]를 사용하여