当调用C语言的Free函数时,C会做些什么动作?
最近按照书上说的,尝试封装了一下C语言的malloc和free函数,代码如下:
[myMallocFree.h:]
#ifndef __MYMALLOCFREE_H__
#define __MYMALLOCFREE_H__
enum myFreeErr
{
myFreeErr_SUCESS=0,/**内存释放成功*/
myFreeErr_DELETED=1,/**指定内存已经释放过了*/
myFreeErr_UNMALLOC=-1,/**指定内存为未分配内存*/
};
typedef enum myFreeErr myFreeErr;
#define TAG_LEN 4
static const char useTag[TAG_LEN]={'U','S','E','D'};
static const char deleteTag[TAG_LEN]={'\0','D','E','L'};
void* myMalloc(size_t sizeToMalloc);
myFreeErr myFree( void *returnAddress );
#endif
[myMallocFree.c:]
#include<stdlib.h>
#include<string.h>
#include<stdio.h>
#include "myMallocFree.h"
/**typedef unsigned int size_t*/
void* myMalloc(size_t sizeToMalloc)
{
void* mallocAddress=NULL;
void* returnAddress=NULL;
if(sizeToMalloc<=0)
{
printf("分配的内存数必须大于0\n");
return NULL;
}
mallocAddress=malloc(sizeToMalloc+TAG_LEN);
if(mallocAddress==NULL)
{
printf("分配内存失败!\n");
return NULL;
}
else
{
/**设置内存分配成功的标签*/
memcpy(mallocAddress,useTag,TAG_LEN);
returnAddress=(char *)mallocAddress+TAG_LEN;
#ifdef __DEBUG__
printf("分配内存mallocAddress=%d,returnAddress=%d\n",mallocAddress,returnAddress);
#endif
return returnAddress;
}
}
myFreeErr myFree( void *returnAddress )
{
/**检查标志*/
char tagOfPtr[TAG_LEN+1]={'\0'};
void* mallocAddress=NULL;
mallocAddress=(char *)returnAddress-TAG_LEN;
memcpy(tagOfPtr,mallocAddress,TAG_LEN);
#ifdef __DEBUG__
printf("tagOfPtr=[%s]\n",tagOfPtr);
#endif
/**若为已分配的内存*/
if(memcmp(tagOfPtr,useTag,TAG_LEN)==0)
{
/**则修改标志为已删除*/
memcpy(mallocAddress,deleteTag,TAG_LEN);
/**删除所有内存*/
free(mallocAddress);
/**并返回"删除成功标识" */
#ifdef __DEBUG__
printf("return myFreeErr_SUCESS\n");
#endif
return myFreeErr_SUCESS;
}
/**若为已经删除过的内存*/
else if(memcmp(tagOfPtr,deleteTag,TAG_LEN)==0)
{
/**则返回"已经删除标识"*/
#ifdef __DEBUG__
printf("return myFreeErr_DELETED\n");
#endif
return myFreeErr_DELETED;
}
/**否则返回"非分配内存标识" */
else
{
#ifdef __DEBUG__
printf("return myFreeErr_UNMALLOC\n");
#endif
return myFreeErr_UNMALLOC;
}
}
[myMallocFreeTest.c:]
#include <stdlib.h>
#include <Stdio.h>
#include <string.h>
#include <assert.h>
#include "myMallocFree.h"
int main()
{
char *chPtr=NULL;
char tagOfPtr[TAG_LEN]={'\0'};
chPtr=myMalloc(20);
if(chPtr==NULL)
{
printf("do myMalloc failed\n");
return 0;
}
if(memcmp(chPtr-TAG_LEN,useTag,TAG_LEN)!=0)
{
printf("myMalloc wrong!\n");
}
if(myFree(chPtr)!=myFreeErr_SUCESS)
{
printf("myFree wrong!(myFreeErr_SUCESS step)\n");
}
if(myFree(chPtr)!=myFreeErr_DELETED)
{
printf("myFree wrong!(myFreeErr_DELETED step)\n");
}
if(myFree(tagOfPtr)!=myFreeErr_UNMALLOC)
{
printf("myFree wrong!(myFreeErr_UNMALLOC step)\n");
}
system("pause");
return 0;
}
在用myMallocFreeTest.c做测试的时候总是报myFree wrong!(myFreeErr_DELETED step)
但是我不知道到底哪出问题了
怀疑是在调用Free函数时C对内存块做了一些操作破坏了设置的标记吧,但是不知道到底做了哪些操作。
求各位大神解答一下~~~谢谢了