2012-10-06 4 views
2

할당 됨 pthread_mutex_t * "malloc()"을 사용하십시오. 프로그램이 중단되거나 종료 될 때 해제해야합니다. 무료가 아니라면 문제가 있습니까? 알다시피, 시스템은 프로세스가 종료 될 때 메모리를 회수합니다. pthread_mutex_t가 나쁜 영향을 미칠 수 있습니까? 그냥 질문 같은pthread_mutex_t * 프로그램이 중단되거나 종료 될 때 해제 되나요?

:

내 프로그램 (텍스트 모드 웹 브라우저) 동적으로 메모리를 할당한다.

물론 런타임 중에 불필요한 블록을 제거합니다. 그리고 정상 종료 전에 모든 것을 무료로합니다. 따라서 메모리 누수 검사기는 잘못된 반응을주지 않을 것입니다. 그리고 중요한 리팩토링이 필요할 때 유연하게 사용할 수 있습니다.

이제 비정상적 종료 전에 메모리를 해제하는 것이 아닙니다. (현재, 내 프로그램은 신호와 실패한 mallocs/reallocs 후에 종료됩니다.)

제 질문은 : 당신은이 나쁜 스타일을 고려하고 있습니까? 비정상 종료시 해방해야합니까?

답변

2

만트라 (또는 비정상 종료)이 모든 '정상 종료에 사용 가능한 모든'에 필자는, 일반적으로, 위쪽 능가 단점,이다 : OS가 alreday 설계되었습니다

1) 테스트 수십억 명의 사용자가 침투 테스트를 거쳤습니다. 모든 코어의 모든 상태에서 모든 스레드를 중지 한 후 쉽게 할당 된 모든 왼쪽 메모리를 해제 할 수 있습니다. 사용자 코드로이 작업을 수행 할 수 있습니까?

2) 코드를 추가해야합니다. 코드를 추가 할 때마다 잠재적으로 더 많은 버그가 추가됩니다. 복잡한 운영 체제 인 다중 스레드 시스템에서 할당 된 메모리를 모두 비우려고하면 OS가 아닌 이상 악몽입니다. 메모리는 모든 곳의 스레드 바, 큐 등에서 사용되며 하나 이상의 스레드가 현재 액세스하고 있거나하지 않을 수 있습니다. 소유권은 불확실하고 지속적으로 변하고 있습니다. 너 할래?

3) 변경/개선/업그레이드 후에 모든 메모리가 해제되도록 시스템을 지속적으로 테스트하고 확장해야합니다.

4) 스레드에서 '종료'플래그 등을 지속적으로 확인하여 스레드가 종료시 메모리를 확보 할 수 있도록하는 것은 추가 오버 헤드입니다.

5) 많은 라이브러리가 어쨌든 닫히면 모든 메모리를 비우지 않습니다. 라이브러리가 불투명/반투명 인 경우 해당 라이브러리에 대해 아무 것도 수행하지 못할 수도 있습니다.

6) 스레드가 심각한 예외를 throw하면 메모리가 사용자 코드에서 해제하려고 시도 할 때 다른 스레드에서 예외가 더 많이 발생할 수 있습니다.

7) 위험/보상 - Valgrind 출력이 좋았고 고객이 보낸 전화/이메일과 비교할 때 '어이, 앱이 종료되지 않고 관리자에게 전화를 걸어 kill-9/TaskManager에 연결해야합니다.'

8) 필터링하여 모든 스레드를 계산합니다. '내 스레드가 내 앱을 종료 할 수 없습니다.'

일부 응용 프로그램에서는 정상 종료시 구조화 된 방식으로 일부 스레드를 종료해야 할 수도 있습니다 (예 : DB 연결을 커밋하고 닫고, 파일을 플러시하고 닫습니다. 메모리를 해제해도 정상 종료시에도 해당 범주에 속하지 않습니다.

앱에 심각한 문제가있는 경우 메모리를 정리해서는 안됩니다. 앱이 이미 더러워 졌으므로 폐기하고 새 인스턴스로 교체해야합니다.

관련 문제