C 언어 메모리 유출이 심각한데 어떻게 대처해야 하나요?

1. 앞말
최근 부처별로 메모리 유출로 인한 온라인 문제가 잇따르고 있는데 구체적으로는 싱글보드가 현망에서 운행된 지 수개월 만에 메모리 소모로 인한 싱글보드 복원 현상으로 나타난다.한편, 메모리 유출 문제는 저급 오류에 속하고 이런 문제가 인터넷에 누락되면 영향이 매우 나쁘다.다른 한편, 메모리 유출 문제로 인해 단판 운행 고정 시간이 지나면 복원될 가능성이 높기 때문에 대량 업그레이드를 통해서만 해결할 수 있고 실제적인 영향도 매우 나쁘다.이 동시에 이런 문제가 잇따르고 있다. 특히 그 중의 한 가지 문제는 우리 직원들의 수정과 도입이다. 이것은 우리 많은 직원들이 메모리 유출 문제에 대한 인식이 아직도 깊지 않다는 것을 의미한다.본고는 메모리 유출 문제의 원리와 검시 방법을 소개함으로써 후속으로 코딩 검시 부분에서 이런 문제의 발생을 막을 수 있기를 바란다.
설명: 메모리 유출을 예방하는 데는 코드 검사, 도구 검사와 메모리 테스트 강화 등 여러 가지 방법이 있는데 본고는 개발자의 능력 향상에 모인다.
2. 메모리 유출 문제의 원리
2.1 C 코드에 메모리를 저장하는 방식
메모리 유출 문제는 메모리를 쌓아 놓을 때만 발생할 수 있으며, 메모리 유출 문제는 창고 메모리가 자동으로 분배되고 방출되기 때문이다.C 코드에 메모리가 쌓여 있는 신청 함수는malloc이며, 흔히 볼 수 있는 메모리 신청 코드는 다음과 같다.
    char *info = NULL;    /**       **/

    info = (char*)malloc(NB_MEM_SPD_INFO_MAX_SIZE);

    if( NULL == info)

    {

        (void)tdm_error("malloc error!
");         return NB_SA_ERR_HPI_OUT_OF_MEMORY;     }

malloc 함수가 실제적으로 메모리 주소로 되돌아오기 때문에 메모리를 저장하는 변수는 반드시 바늘입니다. (코드가 매우 규범에 맞지 않는 경우를 제외하고는)다시 한 번 말하지만 메모리를 저장하는 변수는 반드시 지침이 될 것이다. 이것은 본고의 취지에 대한 이해가 매우 중요하다.물론 이 지침은 단일 지침일 수도 있고 다중 지침일 수도 있다.
malloc 함수에는 g 와 같은 많은 변종이나 봉인이 있다malloc、g_malloc0、VOS_Malloc 등, 이 함수들은 최종적으로malloc 함수를 호출합니다.
2.2 메모리 더미 획득 방법
이 소절의 제목을 보면 몇몇 학우들이 의심할 수 있습니다. 지난 소절의malloc 함수는 메모리를 쌓아 올리는 방법이 아닙니까?확실히malloc 함수를 통해 신청하는 것이 가장 직접적인 획득 방법이다. 이런 메모리 획득 방법만 알면 구덩이에 빠지기 쉽다.일반적으로 메모리를 쌓는 방법은 다음과 같은 두 가지가 있다.
방법 1: 함수 반환 값을 포인터에 직접 부여하는데 일반적으로 다음과 같이 표현됩니다.
    char *local_pointer_xx = NULL;

local_pointer_xx = (char*)function_xx(para_xx, …);

이 클래스는 메모리 요청 함수와 관련되며, 반환 값은 일반적으로 포인터 유형(예:
GSList* g_slist_append (GSList   *list, gpointer  data)

방법2: 포인터 주소를 함수로 반환 매개 변수로 하고 반환 매개 변수를 통해 메모리 주소를 저장한다. 일반적인 표현은 다음과 같다.
    int ret;

    char *local_pointer_xx = NULL;    /**       **/

    ret = (char*)function_xx(..., &local_pointer_xx, ...);

이 클래스는 메모리 요청과 관련된 함수로 일반적으로 하나의 인삼이 이중 지침이다. 예를 들어 다음과 같다.
__STDIO_INLINE _IO_ssize_t

getline (char **__lineptr, size_t *__n, FILE *__stream)

앞에서 말했듯이malloc를 통해 메모리를 신청하는 것은 방법 중의 구체적인 표현 형식에 속한다.사실 이 두 가지 방법의 본질은 똑같다. 모두 함수 내부에서 메모리를 간접적으로 신청한 것이다. 다만 메모리를 전달하는 방법은 다르다. 방법은 반환값을 통해 메모리 지침을 전달하고 방법은 파라미터를 통해 메모리 지침을 전달한다.
2.3 메모리 유출의 세 가지 요소
가장 일반적인 메모리 누출 문제는 다음과 같은 세 가지 요소로 구성됩니다.
요소1: 함수 내에 국부 지침 변수 정의가 있다.
요소2: 이 부분 지침에 대해 이전 소절에서'두 가지 메모리 획득 방법'중 하나를 통해 메모리를 얻는다.
요소3: 함수 반환 전(정상 지점과 이상 지점 포함)에 이 메모리를 방출하지 않았거나 다른 전역 변수에 저장하지 않았거나 상급 함수에 반환하지 않았다.
2.4 메모리 방출 오류
C 언어로 코드를 작성한 적이 있는 사람은 메모리 신청을 쌓은 후에 풀어야 한다는 것을 알아야 한다.그런데 왜 이렇게 메모리 유출 문제가 쉽게 일어날까?한편, 개발자의 경험 부족, 의식 부족 또는 일시적인 소홀로 인한 것이다.다른 한편, 메모리 방출 오류로 인한 것이다.많은 개발자들은 방출할 메모리는 다음과 같은 두 가지에 국한되어야 한다고 생각한다.
1) 메모리 요청 함수로 신청한 메모리, 예를 들어malloc, gmalloc 등;
2) 이 개발자가 익숙한 인터페이스에 메모리 신청이 존재하는 경우. 예를 들어 iBMC의 형제는 다음과 같은 인터페이스를 호출하면list가 가리키는 메모리를 방출해야 한다는 것을 알아야 한다.
dfl_get_object_list(const char* class_name, GSList **list)

상기 사고방식에 따라 코드를 작성할 때 익숙하지 않은 인터페이스에서 메모리를 방출해야 하는 문제에 부딪히면 메모리를 방출하는 의식이 전혀 없고 메모리 유출 문제가 자연히 발생한다.
3. 메모리 유출 문제 점검 방법
메모리 유출 문제를 검시하는 데 관건은 좋은 인코딩 검시 습관을 기르는 것이다.메모리 유출의 세 가지 요소와 대응하여
다음 세 가지를 수행합니다.
1) 함수에 부분적인 지침이 있는 것을 보면 메모리 유출 문제를 경계하고 더욱 조사하는 습관을 길러야 한다
2) 국부 지침에 대한 값 부여 조작을 분석하는데 앞에서 말한'두 가지 메모리 획득 방법'중 하나에 속하는지 분석한다. 만약에 그렇다면 함수가 되돌아오는 지침이 도대체 무엇을 가리키는지 분석해야 한다.전역 데이터, 정적 데이터입니까 아니면 메모리입니까?익숙하지 않은 인터페이스에 대해 대응하는 인터페이스 문서나 원본 코드 분석을 찾아야 한다.또는 코드에서 다른 곳에서 이 인터페이스에 대한 인용을 보고 메모리 방출을 했는지 확인한다.
3) 로컬 포인터에 대한 메모리 요청 작업이 있는지 확인하려면 해당 메모리의 행방을 분석해야 합니다. 글로벌 변수에 저장됩니까?아니면 함수로 되돌아오는 값인가요?만약 그렇지 않다면, 메모리가 정확하게 방출될 수 있도록 함수를 배열해야 한다.

좋은 웹페이지 즐겨찾기