2010-08-13 41 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标准库中实现的。

相关问题