内存管理

Posted on 2016-08-22 15:42  WhatTD  阅读(266)  评论(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 ;

博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3