2010-08-13 99 views
11

realloc如何知道原始數據的大小?realloc如何知道要複製多少?

void *realloc(void *ptr, size_t size); 

因此,如果實現是這樣的:

temp = malloc(size); 
memcpy(.. // How much to copy? 
free(ptr); 
return temp; 

我知道這是不是原來的執行,和realloc並不總是做免費的,但是當它,要花多少錢復制?

編輯: 感謝您的答案。但是,我怎麼才能在malloc/free/..的代碼中實現realloc?

+0

你的realloc實現將不得不遵循malloc和free的實現。在沒有malloc和free的特殊知識的情況下實現它並不是真正可行的。如果你確實得到它與一個malloc實現工作,它可能不會與其他人一起工作。 – nategoose 2010-08-13 17:57:14

回答

17

它知道是因爲malloc在您調用它時記錄了這些信息。畢竟,系統必須始終跟蹤分配塊的大小,以便它不會分配特定區域的內存兩次。

如果你的意思是「它怎麼知道我到目前爲止寫了多少數組」,它不需要。它也可以複製任何未初始化的垃圾。

+0

如果你知道這個信息在哪裏記錄? – sherrellbc 2015-10-22 18:18:03

+0

取決於實施。您可以放心地假設它無法以任何便攜方式訪問。 – ipmcc 2015-12-22 15:45:34

1

realloc(以及malloc和free)可以完全訪問構成堆的整個數據結構。在這個數據結構中是關於塊的大小的信息,這是realloc需要知道的,並且是免費的。

1

當你有一些內存的時候,你得到的塊通常是一個固定的偏移量到一個更大的數據結構中,該結構也保存額外的信息,特別是塊的大小。您可以通過僅注意到以malloc返回的每個地址在以十六進制打印時(例如,將%p替換爲printf)以8結尾來驗證這在某些系統上是否正確。當然,realloc可以反轉這個偏移量並返回到內存管理結構,因此獲得大小;從那裏,能知道多少複製(在必要時)是微不足道的......

3

But how can I then implement realloc in my code with malloc/free/..?

如果您已經使用malloc &免費的,爲什麼不使用realloc的? 另外你可以看看MSVC/gcc等附帶的CRT源代碼(或者就GCC的情況下下載它),看看它們是如何實現的。 如果你運行一個自定義的分配器,那麼它多了幾分情景,如:我用的平板型系統二進制倉,在這種情況下realloc的很簡單:

void* Reallocate(Manager* pManager, void* pBlock, size_t nSize, const char* szFile, const DWORD dwLine) 
{ 
    #if (MMANAGER_NULL_TO_DEFAULT) 
     if(pManager == NULL) 
      pManager = MMANAGER_DEFUALT_MANAGER; 
    #endif 

    if(pBlock == NULL) 
     return Allocate(pManager,nSize,szFile,dwLine); 
    else if(nSize == 0) 
    { 
     Free(pManager,pBlock,szFile,dwLine); 
     return NULL; 
    } 

    BlockHeader* pHeader = GetHeader(pBlock); 
    size_t nPrevSize = pHeader->pPoolBlock->nSize; 
    if(nPrevSize < nSize) 
    { 
     void* pNewBlock = Allocate(pManager,nSize,szFile,dwLine); 
     memcpy(pNewBlock,pBlock,nPrevSize); 
     PoolBlock* pPoolBlock = pHeader->pPoolBlock; 
     if(pPoolBlock == NULL) 
      free(pHeader); 
     else 
      FreeBlock(pPoolBlock,pHeader); 

     return pNewBlock; 
    } 

    return pBlock; 
} 
1

你爲什麼不只是仰望如何在您使用的C標準庫中實現malloc/calloc/realloc/free?或者,如果您無法訪問源代碼,請查看它是如何在其中一個開源C標準庫中實現的。

相關問題