如何正确实现 c malloc/realloc 功能?
How to implement the c malloc/realloc functions properly?
我正在编写自己的 OS 并且必须实现自己的 malloc realloc 函数。但是我认为我写的可能不安全,也可能导致内存泄漏,因为变量并没有真正销毁,它的内存被设置为零,但变量名仍然存在。有人可以告诉我此代码中是否存在任何漏洞?该项目将在用户 subado512 下完成后立即添加到 github。
代码:
void * malloc(int nbytes)
{
char variable[nbytes];
return &variable;
}
void * free(string s) {
s= (string)malloc(0);
return &s;
}
void memory_copy(char *source, char *dest, int nbytes) {
int i;
for (i = 0; i < nbytes; i++) {
*(dest + i) = *(source + i); // dest[i] = source[i]
}
}
void *realloc(string s,uint8_t i) {
string ret;
ret=(string)malloc(i);
memory_copy(s,ret,i);
free(s);
return &ret;
}
使用代码的上下文:一些伪代码以增加可读性
string buffstr = (string) malloc(200);
uint8_t i = 0;
while(reading)
{
buffstr=(string)realloc(buffstr,i+128);
buffstr[i]=readinput();
}
您使用由您的 malloc
编辑的指针 return 的行为是 未定义:您正在 return具有自动存储持续时间的数组。
作为一个粗略的开始,考虑使用一个 static
char
数组来为你的内存池建模,并将其中的 return 部分返回给调用者;构建当前正在使用的数组的 table。请注意,您必须在此处使用 alignment 做一些巧妙的事情,以确保 returned void*
满足 any[ 的对齐要求=24=]类型。 free
将比您在 table 中发布记录多一点。
请注意,典型的 C 运行时库使用的内存管理系统非常复杂。考虑到这一点,请理解您的工作可能只是一个很好的编程练习。
我正在编写自己的 OS 并且必须实现自己的 malloc realloc 函数。但是我认为我写的可能不安全,也可能导致内存泄漏,因为变量并没有真正销毁,它的内存被设置为零,但变量名仍然存在。有人可以告诉我此代码中是否存在任何漏洞?该项目将在用户 subado512 下完成后立即添加到 github。
代码:
void * malloc(int nbytes)
{
char variable[nbytes];
return &variable;
}
void * free(string s) {
s= (string)malloc(0);
return &s;
}
void memory_copy(char *source, char *dest, int nbytes) {
int i;
for (i = 0; i < nbytes; i++) {
*(dest + i) = *(source + i); // dest[i] = source[i]
}
}
void *realloc(string s,uint8_t i) {
string ret;
ret=(string)malloc(i);
memory_copy(s,ret,i);
free(s);
return &ret;
}
使用代码的上下文:一些伪代码以增加可读性
string buffstr = (string) malloc(200);
uint8_t i = 0;
while(reading)
{
buffstr=(string)realloc(buffstr,i+128);
buffstr[i]=readinput();
}
您使用由您的 malloc
编辑的指针 return 的行为是 未定义:您正在 return具有自动存储持续时间的数组。
作为一个粗略的开始,考虑使用一个 static
char
数组来为你的内存池建模,并将其中的 return 部分返回给调用者;构建当前正在使用的数组的 table。请注意,您必须在此处使用 alignment 做一些巧妙的事情,以确保 returned void*
满足 any[ 的对齐要求=24=]类型。 free
将比您在 table 中发布记录多一点。
请注意,典型的 C 运行时库使用的内存管理系统非常复杂。考虑到这一点,请理解您的工作可能只是一个很好的编程练习。