왜 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
'programing' 카테고리의 다른 글
가명일 때는 케이스로 그룹핑을 해주실 수 있나요? (0) | 2023.11.07 |
---|---|
Wordpress Multisite에서 HTACCCESS를 사용하여 WP-CONTER URL에 하위 디렉토리 추가 (0) | 2023.11.07 |
XElement 네임스페이스(방법?) (0) | 2023.11.07 |
SQL(Oracle)의 느낌표 (0) | 2023.11.07 |
오라클에서 예약된 작업을 삭제하는 방법 (0) | 2023.11.07 |