Chinaunix首页 | 论坛 | 博客
  • 博客访问: 12393502
  • 博文数量: 1293
  • 博客积分: 13501
  • 博客等级: 上将
  • 技术积分: 17974
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-08 18:11
文章分类

全部博文(1293)

文章存档

2019年(1)

2018年(1)

2016年(118)

2015年(257)

2014年(128)

2013年(222)

2012年(229)

2011年(337)

分类: C/C++

2013-01-26 16:53:09

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

阅读(3073) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~