Realloc的实现 intgetmin(inta,intb) { 返回一个
Realloc的实现 intgetmin(inta,intb) { 返回一个,c,malloc,free,realloc,C,Malloc,Free,Realloc,malloc不会将内存初始化为零。(calloc是等效的值。)如果您看到设置为零的情况,这是意外的 我相信库版本的realloc使用堆中不直接可用的长度信息(并且它可能高估了原始分配,这意味着在使用realloc扩展分配时可能会复制一些额外内存。这通常没有效果。) realloc在缩小分配时可能不会进行复制 另外,我应该注意到,在相同的情况下,即使realloc增加了大小,例如,如果堆中的下一个块是空闲的,也不必进行复制 malloc分配的内存被初始化为零,因此我正在检查该条件 这是不正确的。从
malloc
不会将内存初始化为零。(calloc
是等效的值。)如果您看到设置为零的情况,这是意外的
我相信库版本的realloc
使用堆中不直接可用的长度信息(并且它可能高估了原始分配,这意味着在使用realloc
扩展分配时可能会复制一些额外内存。这通常没有效果。)
realloc
在缩小分配时可能不会进行复制
另外,我应该注意到,在相同的情况下,即使realloc
增加了大小,例如,如果堆中的下一个块是空闲的,也不必进行复制
malloc分配的内存被初始化为零,因此我正在检查该条件
这是不正确的。从草稿中:
说明
2malloc函数为
大小由大小指定,其值不确定
您的getsize
需要修复
我的重新分配功能运行良好
您甚至没有修复对齐方式——对于某些类型,对齐方式可能会失败。请阅读下面的问题
如果以前分配的内存的大小大于所需的新内存,我们还可以就地重新分配吗
就地重新分配意味着什么?这不是一个简单的禁止操作吗?没有可移植的方法来获取malloc()分配的内存大小 然而,人们总是可以这样做来模拟你想要的东西
int getmin(int a, int b)
{
return a<b?a:b;
}
void *reallocation(void *ptr, size_t size) //size_t in bytes
{
void *newptr;
int msize;
msize = getsize(ptr);
msize = getmin(msize, size);
printf("msize = %d", msize);
newptr = malloc(size);
newptr = memcpy(newptr, ptr, msize);
free(ptr);
return newptr;
}
#包括
#包括
#包括
void myfree(void*p){
尺寸_t*in=p;
如果(在){
--自由的;自由的;
}
}
void*mymalloc(尺寸){
大小t*result=malloc(n+sizeof(大小t));
if(result){*result=n;++result;memset(result,0,n);}
返回结果;
}
大小\u t获取大小(无效*p){
尺寸_t*in=p;
if(in){--in;return*in;}
返回-1;
}
#定义malloc(x)mymalloc(x))
#定义free(x)myfree(x))
作废*重新分配(作废*ptr,大小){
void*newptr;
int-msize;
msize=getsize(ptr);
printf(“msize=%d\n”,msize);
如果(大小我们如何修复对齐?您的总体目标是什么?您只是在重写realloc
,还是在尝试创建一整套内存分配例程?它可能不会意外地设置为零,出于安全原因,大多数操作系统会在新分配的页面中填充零。@JustSid是的,但您不知道这是一个全新的全部已定位的页面。它可能是以前分配和释放的内存。在g++中尝试这个有趣的代码:int*ip=new int;*ip=42;delete ip;int*ip2=new int;std::out我从来没有说过你是否获得一个新页面是决定性的。我只是认为值得一提的是,在某些情况下它并不是意外地为零。如果return类型声明为无符号
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void myfree(void * p) {
size_t * in = p;
if (in) {
--in; free(in);
}
}
void * mymalloc(size_t n) {
size_t * result = malloc(n + sizeof(size_t));
if (result) { *result = n; ++result; memset(result,0,n); }
return result;
}
size_t getsize(void * p) {
size_t * in = p;
if (in) { --in; return *in; }
return -1;
}
#define malloc(_x) mymalloc((_x))
#define free(_x) myfree((_x))
void *reallocation(void *ptr,size_t size) {
void *newptr;
int msize;
msize = getsize(ptr);
printf("msize=%d\n", msize);
if (size <= msize)
return ptr;
newptr = malloc(size);
memcpy(newptr, ptr, msize);
free(ptr);
return newptr;
}
int main() {
char * aa = malloc(50);
char * bb ;
printf("aa size is %d\n",getsize(aa));
strcpy(aa,"my cookie");
bb = reallocation(aa,100);
printf("bb size is %d\n",getsize(bb));
printf("<%s>\n",bb);
free(bb);
}