2012-09-09 1 views
0

저는 개인 프로젝트로 몇 가지 PHP 확장을 작성하고 있습니다. (저는 전문적으로 몇 년 전에 실시간 및 프로세스 제어 어플리케이션을 개발하기 위해 C를 사용했기 때문에 항상 메모리 할당 자 반환을 검사하고 오류 경로가 메모리를 누설하지 않도록 약간 편집증에 빠졌습니다. 그런 다음 C++ 및 . 예외 핸들러는) 지금은 간단한 질문이 있습니다emalloc에 ​​대한 테스트 상태를 반환합니다

해야합니까 또는 나는 buf 이후에 NULL 검사를 수행 할 필요가 없습니다하십시오 FLOSS 프로젝트에 일반적으로

buf = emalloc(rec->len); 

, 난 그냥 사용합니다 이런 종류의 Q에 대답하기위한 템플릿으로서의 기존 소스. 그러나 PHP 확장은 일관성이 없습니다. 복잡한 C 사전 처리 된 코드를 정적으로 분석하는 것은 비현실적이며, 필자는 자체 LAMP 스택을 쉽게 테스트 할 수 있습니다. 기본적으로 emalloc 코드에서 힙 피로에 대한 zend 오류 루틴을 호출하지만 코드는 계속 0을 반환합니다. 일부 확장 코드의 경우 NULL 반환을 확인하지만 PHPAPI void php_basename()과 같은 예제도 ext/standard/string.c과 같이 찾을 수 있습니다.

emalloc가 zend 예외를 throw하는 대신 반환하는 경우 하드 메모리 예외를 생성합니다.

공식 PHP 개발자의 답변을 아는 분이라면 누구든지이 점에 대해 감사드립니다. 감사.

+2

그 'emalloc' 함수에 대한 문서는 이것에 대해 무엇을 말합니까? – Mat

+0

많은 수의 메모리를 할당하여 이러한 상황을 만들 수 있습니다 :'emalloc (99999999999)'(필요한 경우 9 초 추가). – Lekensteyn

+0

@Mat, 나는 ** unwind **가 지적한 한 문장을 놓쳤다. FLOSS 프로젝트에 대한 저의 경험 (필자는 4 점에만 기여했습니다)은 그러한 문서가 최소한이거나 존재하지 않는다는 것입니다. 개발자는 신경 쓸 필요가 없으며 코드 검사에서이를 다시 조작해야합니다. 기본 MM 시스템 전체를 다루는 [한 페이지] (http://php.net/manual/en/internals2.memory.management.php)는 평균보다 낫습니다. – TerryE

답변

2

The documentation 명확하게 상태 :

참고 : 젠드 엔진의 메모리 관리 기능이 요구 된 메모리를 할당하는 동안 문제의 경우 NULL을 반환하지만, 구제와 현재를 종료하지 않습니다 자신의 C 표준 라이브러리의 대응과는 달리 의뢰.

+0

고마워요. 나는이 한 페이지 호출기에서이 메모를 놓쳤다. 왜 저를 버렸을까요? 실제로 몇몇 e * 루틴은'return 0; 또는'return NULL; '으로 끝나는 연속 경로를 포함하고 있습니다. 엔진이 메모리 고갈 오류를 발생시키는 이유는 무엇입니까? – TerryE

관련 문제