C 언어 에서 free 함수 의 사용 에 대한 상세 한 설명

3748 단어 c 언어free 함수
free 함 수 는 우리 가 C 언어 프로그램 을 다시 쓸 때 자주 사용 하 는 함수 이지 만 사용 할 때 주의해 야 합 니 다.조심 하지 않 으 면 토 핵 을 일 으 킬 수 있 습 니 다.
 메모:free 함수 와 malloc()함수 가 짝 을 지어 사용 하고 malloc 함수 가 신청 한 동적 메모 리 를 방출 합 니 다.free(p)라 는 문구 에 대해 p 가 NULL 지침 이 라면 free 대 p 는 몇 번 을 조작 하 더 라 도 문제 가 되 지 않 습 니 다.만약 p 가 NULL 포인터 가 아니라면,free 대 p 를 두 번 연속 으로 조작 하면 프로그램 실행 오류 가 발생 할 수 있 습 니 다.
 프로그램 을 보다

#include <stdio.h>
#include <stdlib.h>

int main()
{
  char * name = NULL;
  free(name);
  free(name);
  free(name);
  
  printf("no problem11111111
"); name = (char *) malloc(10); if(name) { printf("allocate successful
"); } else { printf("allocate failed
"); } free(name); free(name); printf("no problem2222222
"); return 0; }
실행 결과:

이 프로그램 은 마침 위의 주의사항 을 검증 했다.
이 오류 가 발생 하지 않도록 함 수 를 썼 습 니 다.

void myfree(void ** point)
{
  if(*point != NULL)
  {
    free(*point);
    *point = NULL;
  }
}
이 함 수 는 1 급 포인터 의 주 소 를 채소 로 입력 하면 1 급 지침 을 조작 할 수 있 습 니 다.매번 free 로 공간 을 풀 때마다 1 단 지침 을 NULL 로 설정 하면 중복 방출 시 프로그램 이 무 너 지 는 것 을 피 할 수 있 습 니 다.
이 함 수 를 아까 프로그램 에 적용 하면:

#include <stdio.h>
#include <stdlib.h>


void myfree(void ** point)
{
  if(*point != NULL)
  {
    free(*point);
    *point = NULL;
  }
}


int main()
{
  char * name = NULL;
  
  myfree((void**)&name);
  myfree((void**)&name);
  myfree((void**)&name);
  
  printf("no problem11111111
"); name = (char *) malloc(10); if(name) { printf("allocate successful
"); printf(" : %p
",name); } else { printf("allocate failed
"); } myfree((void**)&name); myfree((void**)&name); printf("no problem2222222
"); return 0; }

 프로그램 에 오류 가 없 음 을 알 수 있 습 니 다.
그러나 또 하나의 문 제 는 처리 해 야 합 니 다.my free 함 수 를 호출 할 때마다 1 급 포인터 의 주 소 를 찾 아야 하고 강제 형식 을 void**로 바 꿔 야 합 니 다.즉,매번(void**)&point 를 써 야 합 니 다.그러면 귀 찮 습 니 다.
사실 우 리 는 파 라 메 터 를 가 진 매크로 정의 로 코드 를 간소화 할 수 있 습 니 다.매크로 정 의 는 다음 과 같 습 니 다.

#define FREE(p) myfree((void **)&p)
 매크로 정 의 를 사용 한 전체 코드:

#include <stdio.h>
#include <stdlib.h>


#define FREE(p) myfree((void **)&p)


void myfree(void ** point)
{
  if(*point != NULL)
  {
    free(*point);
    *point = NULL;
  }
}


int main()
{
  char * name = NULL;
  
  FREE(name);
  FREE(name);
  FREE(name);
  
  printf("no problem11111111
"); name = (char *) malloc(10); if(name) { printf("allocate successful
"); printf(" : %p
",name); } else { printf("allocate failed
"); } FREE(name); FREE(name); printf("no problem2222222
"); return 0; }
자,오늘 은 여기까지 쓰 겠 습 니 다.도움 이 되 셨 으 면 좋 겠 습 니 다.잘못된 부분 이 있 으 면 지적 해 주세요.감사합니다.

좋은 웹페이지 즐겨찾기