2014-06-06 2 views
2

malloc 주위에 래퍼 함수를 ​​작성하려고합니다. 필자가 작성한 코드는 다음과 같습니다.하지만 작동 여부는 확실하지 않습니다.malloc 주위 래퍼 작동합니까?

누군가가 그것을 살펴보고 제대로 작동하는지 알려주고, 그렇지 않은 경우 알려주시겠습니까? 여기

int main() 
{ 
    int i=1; 
    char *k; 
    while(i<3) 
    { 
     i++; 
     k = (char *) CountMalloc(1024); 
     printf(" Total mem : %d \n Memory Address:%x \n",Totalmem,k); 
    } 

    printf(" Exiting\n"); 
    return 0; 
} 

내가 메모리를 할당하고 무효를 포인터를 전달하려고하는 기능입니다. 포인터를 선언하고 함수의 주소를 함수에 전달하면 malloc 함수 호출을 호출하여 전달 된 포인터에 주소를 할당합니다. 그러나 나는 다음과 같은 코드가 작동하는지 알고 싶어

void * CountMalloc(int size) 
{ 
    char *p; 
    Totalmem += size; 
    return (malloc (size)); 
} 
+2

size 인수에'size_t'를 사용하는 것이 더 좋지만, 그렇지 않으면 왜 작동하지 않는지 알 수 없습니다. – MightyPork

+2

C에서'malloc'을 형 변환하지 마십시오. 또한, 보통'main (void)'라고 씁니다. – gsamaras

+0

'-Wall'로 컴파일하면 몇 가지 경고가 나타납니다. 왜 이렇게되는지 보도록하겠습니다. –

답변

5

몇 가지 참고 사항 : malloc()에 인수 size_t로 선언

따라서 CountMalloc()size 매개 변수도 size_t을해야합니다.

malloc()의 결과를 확인하지 않아도 할당이 성공했는지 확인하지 않습니다. 대신 다음을 수행하십시오.

void * CountMalloc(size_t size) 
{ 
    void * allocation = malloc(size); 
    if (allocation) { 
     Totalmem += size; 
    } 
    return allocation; 
} 

그러나 할당 된 메모리의 총량이 많을 수 있습니다. 대부분 malloc() 구현은 사용자가 요청한 것보다 더 많은 메모리를 할당하므로 반환되는 메모리 위치보다 먼저 할당에 대한 정보를 저장할 수 있습니다.

그렇지 않으면 코드가 의도 한 효과를 내지 못하게하는 심각한 문제는 없습니다.

+0

"[M] ost'malloc()'구현"비트에 약간의 설명을 추가하기 만하면됩니다. 'free'가 실제로 무엇이든하는'malloc '을 원하는 malloc은 객체의 크기를 어딘가에 저장해야합니다. 그렇지 않으면,'자유로운'은 메모리 조각이 얼마나 큰 메모리인지를 알지 못합니다. 'malloc()'에 의해 반환 된 포인터 앞의 바이트 (들)가 저장되어 있기 때문에 매우 간단하고 빠른 방법으로 그 정보를 검색 할 수 있습니다. –

+0

cdhowie 여러분은 allcation이 로컬 varialbe이고 곧 함수가 반환 될 때 사라지는다고 생각하지 않습니다. 그것은 시간이 걸릴 수 있지만 내 이해에 따라 항상 작동하지 않을 수 있습니다. – user3161006

+0

@ user3161006 아니요, malloc()은 스택이 아닌 힙에 메모리 블록을 할당합니다. 이 메모리는 그 할당에서'free()'가 호출되거나 프로그램이 종료 될 때까지 할당 된 채로 남아 있습니다. – cdhowie

0

코드가 malloc()을 통해 총 메모리 요청을 추적하는 동안 반환되는 개체에 사용되는 총 메모리 양을 실제로 추적하지 않습니다. 대부분의 할당자는 임의의 크기의 객체를 반환하지 않고 고정 된 크기의 객체 풀 (4 바이트, 8 바이트 등)을 가지며 요청 된 크기를 충족시킬 수있는 가장 작은 객체를 반환합니다.

개체가 임의의 크기를 허용하더라도 바이트 또는 단어 주소 지정을 허용하는 하드웨어에 따라 반환되는 메모리 블록의 크기를 반올림하거나 개체 재사용 성을 최대화하는 경우가 많습니다.

마지막으로, 다른 답변에 대한 설명에서 언급 한 것처럼 개체의 크기가 개체의 크기를 저장하는 숨겨진 헤더를 사용하기 때문에 후속 free()은 얼마나 큰 블록이 반환되는지 알 수 있습니다.