2011-12-27 3 views
-3

이 래퍼를 실제로 사용하고 싶습니다만, 문제는 아직 안전하지 않은지 잘 모릅니다.메모리로 안전하게하는 방법?

malloc(), calloc()realloc()과 관련하여 몇 가지 간단한 질문이 있습니다. 여기에 지금까지이 작업은 다음과 같습니다

string.h

typedef struct str str; // pointer for encapsulation 

string.c

struct str 
{ 
    char *buf; 
    size_t len; 
} 

내가 단순히이 수행하는 도우미 함수가 말 :

str *NEW_STRING() 
    { 
     str *temp = calloc(1, sizeof (struct str)); 
     temp->len = 0; 
     temp->buf = (char *) malloc(1); 
     return temp; 
    } 

인가를 이 금고? 이 경우 나는 이런 식으로 뭔가 한 경우에, 무슨 일이 일어날 것 :

str *A_STRING = NEW_STRING(); 
A_STRING = NEW_STRING(); 

그것은 두 배의 malloc과은 calloc을 부를 것이다, 즉 나쁜입니까? 이니셜 라이저가 더 좋을까요?

void str_init(str *A_STRING) 
{ 
    if (A_STRING) 
    { 
     free(A_STRING); 
    } 

    if (A_STRING->buf) 
    { 
     free(A_STRING->buf); 
    } 

    A_STRING = calloc(1, sizeof (struct str)); 
    A_STRING->buf = (char *) malloc(1); 
    A_STRING->len = 0; 
} 

마지막으로 메모리를 해제하는 좋은 방법입니까?

void free_string(str *A_STRING) 
    { 
     if (A_STRING->buf) 
     { 
      free(A_STRING->buf); 
     } 
     else 
     { 
      A_STRING->buf = NULL; 
     } 

     if (A_STRING) 
     { 
      free(A_STRING); 
     } 
     else 
     { 
      A_STRING = NULL; 
     } 

     A_STRING->len = 0; 
    } 

추가 정보가 있으면 좋을 것입니다. 나는 좋은 도서관 인 것처럼 대중에게 무엇이든 공개하고 싶지 않습니다. 왜냐하면 저는 주로 학습 목적으로 이것을하고 있기 때문입니다. 오류의

+1

정말 C++이 없으면 많은 것을 할 수 없습니다. – SLaks

+0

내가 C++을 좋아하지 않아. – joob

+0

두 번째 코드 스 니펫에서 'temp'는 할당 실패로 확인되지 않는다. – fge

답변

5

많은 :

이 안전합니까?

번호

str *NEW_STRING() 
{ 
    str *temp = calloc(1, sizeof (struct str)); 

    // If calloc fails and returns NULL all the code below is invalid and blows the code up. 

다음 :이 경우, 나는 이런 식으로 뭔가 한 경우에, 무슨 일이 일어날 것이라고는 두 배의 malloc과은 calloc 부를 것이다

를, 그게 나쁘다? 이니셜 라이저가 더 좋을까요?

메모리 누출.
두 번째 호출은 기본적으로 이전 객체가 손실되어 누출되는 새 객체를 생성합니다. str_init에서

문제는 그의 방법은

void str_init(str *A_STRING) 
{ 

이 처음이다라는 것을?
그렇다면 A_STRING에 무작위 값 (약 FREE)이 포함되어 있습니다.
코드를 날려 버릴 것입니다.

if (A_STRING) 
    { 
     free(A_STRING); 
    } 

a_string에서은 (이제 더 이상 액세스 할 수 있습니다) 해제됩니다.
코드가 잘못되었습니다.

if (A_STRING->buf) // Bang blow up code. 
    { 
     free(A_STRING->buf); 
    } 

    A_STRING = calloc(1, sizeof (struct str)); 

calloc의 결과를 확인하지 않았습니다.

A_STRING->buf = (char *) malloc(1); 
    A_STRING->len = 0; 
} 

이 가능한 메모리에 좋은 방법입니다?

void free_string(str *A_STRING) 
{ 
    if (A_STRING->buf) 
    { 
     free(A_STRING->buf); 
    } 
    else 
    { 
     A_STRING->buf = NULL; // Its already NULL pointless work 
    } 

    if (A_STRING) 
    { 
     free(A_STRING); 
    } 
    else 
    { 
     A_STRING = NULL; // ITs already NULL pointless work 
    } 

    // BANG you just blew up the space shuttle. 
    A_STRING->len = 0; 
} 
+0

오, 맨. 이 모든 정보에 감사드립니다. – joob

+0

'free_string()'함수에서, 다른 일을하기 전에'if (A_STRING)'을 체크해야합니다. 당신 (OP)이 그것을 검사 할 때까지, 그것이 널이라면, 프로그램은'if (A_STRING-> buf)'에서 폭발했다. –

관련 문제