문제

내가 하기로 결정한 것은

  • malloc에 ​​전화해
  • 이전 블록을 새 블록에 복사
  • 오래된 블록을 비워라
  • 그리고 새로운 블록에 대한 포인터를 반환합니다.

아래 코드는 내가 지금까지 가지고 있는 코드입니다. 하지만 옳지 않다는 것을 알고 있습니다. 코드를 수정하는 데 도움을 주시면 대단히 감사하겠습니다...

제가 제공한 것보다 더 많은 코드가 필요하다면 이 게시물 이전에 모든 코드를 보여주는 게시물이 있습니다.초보라서 이번 포스팅과 마지막 포스팅만 남았네요.감사합니다.

void *mm_realloc(void *ptr, size_t size)
{
int i, p = *ptr;

 // make a call to malloc to find space
 //allocate memory

 ptr = malloc(size_t*sizeof(int));

 //copying old block to new block
 if(ptr!=NULL)
     for(i=0 ; i<size_t ; i++) 
     {
     *(ptr+i) = i;
     }

//freeing old block
free(ptr);

//return pointer to new block
return *ptr;
}
도움이 되었습니까?

해결책

이상적으로는 realloc() 현재 블록을 넘어 충분한 여유 메모리가 있는지 간단히 확인하고, 그렇다면 아레나 데이터 구조를 조정하여 현재 블록을 제자리에서 확장하면 됩니다.이렇게 하면 비용이 많이 드는 복사 작업이 제거되고 할당 실패 가능성이 줄어듭니다.크기를 늘리기 위해서입니다.축소를 위해서는 항상 그 자리에서 수행하여 현재 블록의 나머지 부분을 여유 풀로 다시 보낼 수 있어야 합니다.

malloc/free를 수행하여 단일 60K 블록이 할당된 경기장에 100K가 있는 경우 mm_realloc 크기를 50K로 조정하면 실패합니다.

그러나 그것은 움직일 수 있는 적어도 첫 번째 시도에서는 해결책을 찾았으므로 이를 구현하는 방법은 다음과 같습니다.

void *mm_realloc (void *ptr, size_t size) {
    int minsize;
    void *newptr;

    // Allocate new block, returning NULL if not possible.

    newptr = malloc (size);
    if (newptr == NULL) return NULL;

    // Don't copy/free original block if it was NULL.

    if (ptr != NULL) {
        // Get size to copy - mm_getsize must give you the size of the current block.
        // But, if new size is smaller, only copy that much. Many implementations
        // actually reserve the 16 bytes in front of the memory to store this info, e.g.,
        // +--------+--------------------------------+
        // | Header | Your data                      |
        // +--------+--------------------------------+
        //           ^
        //           +--- this is your pointer.
        // <- This is the memory actually allocated ->

        minsize = mm_getsize (ptr);
        if (size < minsize)
           minsize = size;

        // Copy the memory, free the old block and return the new block.

        memcpy (newptr, ptr, minsize);
        free (ptr)
    }

    return newptr;
}

여러분의 것에서 빠진 한 가지 사실은 다음을 위해 충분한 바이트만 복사해야 한다는 것입니다. 가장 작은 오래된 블록과 새로운 블록의 모습입니다.그렇지 않으면 그 중 하나가 오버플로되어 코어 덤프의 위험이 있습니다.

또한 루프는 실제로 데이터를 복사하지 않았고 블록의 각 바이트를 오프셋으로 설정했으며 새 포인터를 할당할 때 이전 포인터를 잃어버렸습니다. newptr 별도로 보관합니다.

다른 팁

이전 블록의 크기와 새 블록의 크기를 알아야 합니다.두 크기 중 더 작은 크기를 새 블록 위에 복사해야 합니다.

또한 malloc()이 실패하면 이전 블록을 파괴(해제)하지 않도록 해야 합니다. 그냥 0을 반환하면 됩니다.

또한 malloc()에서 크기에 'sizeof(int)'를 곱할 필요가 없습니다.실제로 4배 이상의 요소를 초과 할당하고 있습니다(이론적으로는 2배에 불과할 수도 있지만 요즘 16비트 컴파일러를 사용하는 사람은 거의 없습니다).

요점은 realloc 가능하다면 메모리 블록을 그 뒤에 있는 빈 블록과 병합하려고 시도한다는 것입니다.사용 가능한 메모리가 없는 경우에만 새 메모리를 할당하고 모든 것을 복사한 다음 이전 블록을 해제합니다.

그런데 왜 자신만의 할당 루틴을 작성하고 있나요?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top