programing

왜 Py_를 해야 합니까?C에서 Py_None을 반환하기 전에 INCRECF(Py_None)가 필요합니까?

muds 2023. 11. 7. 21:10
반응형

왜 Py_를 해야 합니까?C에서 Py_None을 반환하기 전에 INCRECF(Py_None)가 필요합니까?

왜 Py_를 해야 합니까?다음과 같이 C에서 Py_None을 반환하기 전에 CRINCF(Py_None)가 필요합니까?

Py_INCREF(Py_None);
return Py_None;

Py_INCREFF(Py_None)가 생략되면 어떻게 됩니까?

누락된 APy_INCREF에 대한 참조 수를 잘못 세게 됩니다.Py_None, 그로 인해 인터프리터가 할당을 해제하게 될 수도 있습니다.Py_None.부터Py_None에 정적으로 할당됩니다.Objects/object.c파일:

PyObject _Py_NoneStruct = {
  _PyObject_EXTRA_INIT
  1, &PyNone_Type
};

그리고 인.Include/object.h다음과 같은 정의가 있습니다.

#define Py_None (&_Py_NoneStruct)

그러면 통역사가 치명적인 오류와 함께 충돌하게 되는 것입니다.

Fatal Python error: deallocating None

에 의해 생성되는 것.none_dealloc기능을 다함Objects/object.c:

/* ARGUSED */
static void
none_dealloc(PyObject* ignore)
{
    /* This should never get called, but we also don't want to SEGV if
     * we accidentally decref None out of existence.
     */
    Py_FatalError("deallocating None");
}

그 논평에 언급된 바와 같이, 만일NoneType할당 해제 기능이 자체적으로 없었기 때문에 분할 오류를 얻을 수 있었습니다.free스택에서 호출이 수행됩니다.

자습서의 예제를 복사하여 다음에 호출을 추가하여 테스트할 수 있습니다.Py_DECREF(Py_None)안으로Noddy_name함수, 확장을 구축하고 그 방법을 호출하는 루프를 수행합니다.


일반적인 경우 기준 카운트는0프로그램이 여러 가지 방법으로 실패하게 할 수 있습니다.

특히 python은 할당 해제된 개체가 사용하는 메모리를 자유롭게 다시 사용할 수 있습니다. 즉, 개체에 대한 모든 참조가 임의의 개체(또는 빈 메모리 위치)에 대한 참조가 될 수 있으며 다음과 같은 것을 볼 수 있습니다.

>>> None   #or whatever object that was deallocated
<ARandomObjectYouNeverSawBefore object at ...>

(C 확장자를 쓸 때 이런 이 가끔 있었습니다.호출 누락으로 인해 읽기 전용으로 변하는 일부 개체는 임의 시간에 버퍼만 사용할 수 있습니다.Py_INCREF).

다른 상황에서는 다른 종류의 오류가 발생하거나 통역사가 충돌하거나 오류가 발생할 수 있습니다.

Py_None메소드가 없는 것을 제외하고는 정말로 또 다른 파이썬 오브젝트일 뿐입니다.

Python은 모든 참조를 셀 것입니다.PyObject*. 문자열이든 정수든 아니든 상관 없습니다.

참조 횟수를 증가시키지 않으면 Python 인터프리터는 참조 횟수가 도달한 후 개체를 폐기합니다.0, 그 물체에 대한 어떤 지시도 없다고 생각하는 것입니다.이는 다음 번에 반환 값을 사용하여 무언가를 시도할 때 메모리에서 고정이 보장되지 않는 위치로 포인터를 따라가는 것을 의미합니다.Py_None(오류, 이상값, 세그멘테이션 폴트 등).

사용하는 것을 기억해야 하는 대안이 있습니다.Py_INCREF(Py_None):

return Py_BuildValue("");

아니면

Py_RETURN_NONE;

언급URL : https://stackoverflow.com/questions/15287590/why-should-py-increfpy-none-be-required-before-returning-py-none-in-c

반응형