Comment Realloc connaît-il la taille des données d'origine? Donc, si la mise en œuvre est comme ceci: p> temp = malloc(size);
memcpy(.. // How much to copy?
free(ptr);
return temp;
5 Réponses :
Il sait parce que Si vous voulez dire, comment ça sait combien de la matrice que j'ai écrite jusqu'à présent », cela n'a pas besoin de. Il peut simplement copier des ordures non initialisées également. P> masloc code> a enregistré cette information lorsque vous l'avez appelé. Après tout, le système doit garder une trace de la taille des blocs alloués de toute façon afin qu'il n'alloue pas deux fois une région de mémoire particulière. P>
Dépend de la mise en œuvre. Vous pouvez supposer en toute sécurité que ce n'est pas accessible à vous de manière portable.
Realloc (et Malloc et gratuit) ont un accès complet à l'ensemble de la source de données qui constitue le tas. Dans cette DataStructure, des informations sur la taille des blocs, qui ont besoin de savoir, de manière libre. P>
Lorsque vous MALLOC CODE> Certaines mémoire, le bloc que vous obtenez est généralement un décalage fixe dans une structure de données plus grande qui contient également des informations supplémentaires, notamment la taille du bloc. Vous pouvez vérifier que cela est vrai sur certains systèmes en notant que chaque adresse renvoyée par
Malloc code> se termine dans
8 code> lorsqu'il est imprimé en hexal (par exemple, avec le
% p Code> Substitution à
PrintF code>). Bien sûr,
realloc code> peut inverser ce décalage et revenir à la structure de gestion de la mémoire, puis obtenir la taille; De là, être capable de savoir combien de copier (si nécessaire) est trivial ... p>
Si vous utilisez déjà MALLOC & GRATUIT, pourquoi pas simplement utiliser Realloc?
sinon, vous pouvez simplement consulter la source CRT qui est livré avec MSVC / GCC, etc. (Ou tout simplement le télécharger, dans le cas de GCC) et voyez comment ils le mettent en œuvre.
Si vous exécutez un allocator personnalisé, c'est un peu plus situationnelle, par exemple: j'utilise une corbeille binaire avec un système de type dalle, auquel cas Realloc est simple: P> Mais comment puis-je puis implémenter realloc dans mon code avec malloc / free /..?
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;
}
Pourquoi ne cherchez-vous pas comment Malloc / Calloc / RealLoc / Gratuit est implémenté dans la bibliothèque standard C utilisée? P>
ou, si vous n'avez pas accès au code source, examinez la manière dont elle est mise en œuvre dans l'une des bibliothèques standard C Open-Source C. p>
Votre mise en œuvre de Realloc devra suivre la mise en œuvre de MALLOC et GRATUITEMENT. La mise en œuvre sans la connaissance spéciale que MALLOC et GRATUITE n'a pas vraiment été faisable. Si vous avez obtenu le travail avec une implémentation MALLOC, cela ne fonctionnerait probablement pas avec les autres.