malloc、free函数使用注意事项

3110阅读 0评论2013-01-26 dyli2000
分类:C/C++

1、malloc函数的作用

malloc函数可以从堆上获得指定字节的内存空间。

 

2、malloc函数的声明

void* malloc(int n);

(1)、n为要求分配的字节数;分配成功返回内存空间首地址;失败返回NULL

(2)、返回类型是void型指针,故可以将其转换后赋给任意类型指针,通过赋值就可以通过操作从堆上获取的内存空间。

 

3、malloc函数使用注意点

由于malloc分配的内存空间是未初始化的,所以使用前应使用memset将其全部初始化为0。

void *memset(void *p,int c,int n)

p为要清0的内存首地址;C为要设定的值,如0;n为被操作的内存空间的字节长度;

 

4、malloc与memset搭配使用的案例如下

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    int *p = NULL; 
    p = (int*)malloc(sizeof(int)); 
    if ( p == NULL) 
    { 
        printf("Can't get memory!\\n"); 
        return    ERROR; 
    }
    printf("%d\\n",*p); 
    memset(p,0,sizeof(int)); 
    printf("%d\\n",*p); 
    *p = 2; 
    printf("%d\\n",*p); 
    return 0; 
}

 

image

 

5、从堆上获得的内存空间在程序结束后,系统不会将其自动释放!!需要程序员来自己管理。所以,一个程序结束时,必须保证所有从堆上获得的内存空间已被安全释放,否则会导致内存泄露。

如何处理?

操作系统提供了free函数来处理这个情况。

void free(void *p)

可以看到,free函数的形参是void*,所以可以接受任意类型的指针实参。

需要注意的是,free函数只是释放指针指向的内容,而该指针仍然指向原来指向的地方,此时就形成经典的野指针,若再对该指针进行操作,就会引起不可预期的错误。

 

所以free的安全使用法,在上例的return 0前加上下面两句:

free(p);

p = NULL;

将指针的值置为NULL

上一篇:模板方法模式在学生出操点名的应用
下一篇:calloc函数使用注意事项