2015-02-01 4 views
1

저는 C++에서 파이썬을 임베드하고 있습니다.종료시 tp_dealloc이 맞지 않습니다.

저는 C++ Python 확장 객체를 사용하고 있습니다.

잘못된 점은 사용자 정의 함수로 tp_dealloc을 설정하면 결코 호출되지 않는다는 것입니다.

Py_Finalize()가이 문제를 일으키거나 프로그램을 종료한다고 생각했을 것입니다. 하지만.

누구나 tp_dealloc이 맞지 않는 이유를 제안 할 수 있습니까?

답변

1

여기에서 문제는 참조 계산 중 하나라고 생각합니다.

PyType_Ready()는 유형의 기준에 따라 다양한 tp_ * 입력란을 채 웁니다.

이 중 하나는 tp_alloc이며 0으로 설정되어 있습니다. doc에서 refcount가 1로 설정되고 메모리 블록이 0으로 설정되어 있습니다.

모든 인스턴스 파이썬은이 유형의 인스턴스를 만들고, 새로운 PyObject가 적절한 파이썬 사전에 추가됩니다. 모듈 수준 변수 인 경우 모듈 사전입니다.

사전이 삭제되면 DECREF가 포함 된 개체가 삭제됩니다. 이제 refcount는 0이 될 것이고 tp_dealloc가 실행될 것입니다.

내 코드에서 어딘가에 여분의 INCREF를 수행하고 있으며 개체가 가비지 수집 된 적이없는 것처럼 보입니다.

특정 플래그로 컴파일하지 않는 한 Python에는 모든 객체를 추적 할 수있는 링크 된 목록이 없습니다. 그래서 우리는 Py_Finalize()가 정리 될 것이라고 가정 할 수 없습니다. 그것은하지 않을 것이다!

대신 모든 객체는 포함 된 범위에 대해 사전에 보관되며, 다시 모듈 사전에 저장됩니다. 이 모듈 사전이 파괴 될 때, 파괴는 모든 가지를 통해 바깥쪽으로 움직일 것입니다.

+1

동일한 문제가 있었고이를 사용하여 발견되었습니다 : sys.getrefcount (object) – alex