码迷,mamicode.com
首页 > 其他好文 > 详细

内存管理

时间:2016-08-22 16:08:18      阅读:92      评论:0      收藏:0      [点我收藏+]

标签:

栈、堆、静态区

内存分为3个部分:堆、栈、静态区     堆栈就是栈stack,不是堆heap

堆: 由malloc系列函数 或 new操作符分配的内存。 其生命周期由free或delete决定。 在没有释放之前一直存在,直到程序结束。

栈: 保存局部变量。栈上的内容只在函数的范围内存在,当函数运行结束,这些内容也会自动被销毁。

静态区: 保存自动全局变量 和 static变量 ,  由编译器在编译的时候分配。

 

常见的内存错误及对策 

1、结构体成员指针未初始化

struct  student

{

     char * name;

     int  score;

} stu , * pstu;

// name 指针并没有指向一个合法的地址;

//解决的办法是为 name指针 malloc一块空间

int  main()

{

   strcpy(stu.name , "Jimy");

    stu.score = 99;

    return  0 ;

}

 

int  main()

{

     pstu =  (struct student *) malloc(sizeof(struct student));

     strcpy(pstu->name , "Jimy" );

      pstu -> score = 99;

      free(pstu);

      return 0 ;

}

2、没有为结构体指针分配足够的内存

int  main()

{

    pstu  =  (struct student*) malloc(sizeof(struct student *));  //malloc(sizeof(struct student))

    strcpy(pstu->name , "Jimy");

    pstu->score = 99;

    free(pstu);

    return 0;

}

3、函数的入口校验

不管什么时候,我们使用指针之前一定要确保指针是有效的。

对参数进行效验: assert(NULL != p)  //在函数入口处  //assert是一个宏,而不是函数,包含在assert.h头文件中。

对非参数的地方:  if(NULL != p)

 

为指针分配的内存太小

char *p1  = "abcdefg";

char *p2  =  (char *) malloc(sizeof(char)*strlen(p1));

strcpy(p2,p1);

//

字符串常量的结束标志"\0"

不要因为char类型大小为1个字节就省略sizeof(char)这种写法,这样只会使你的代码可移植性下降。

char * p2  = (char *) malloc(sizeof(char)*strlen(p1) + 1*sizeof(char) );

用malloc函数申请0字节内存???

内存释放 + 内存释放之后

free(p);    p = NULL ;

内存管理

标签:

原文地址:http://www.cnblogs.com/yangjin2010/p/5795853.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!