内存管理

来源:互联网 发布:applem2引擎完整源码 编辑:程序博客网 时间:2024/05/16 14:28

1、野指针,数组越界范围

  1.1当一指针不再用是一定记得要让起指向NULL

        1.2数组越界访问可能会导致非法访问的错误

2、堆、栈、静态区

  2.1 堆是编译器留给程序员开辟的区域,malloc和new两函数。其生命周期有free和delete决定

  2.2 栈是系统运行时保存局部变量,生命周期有函数自身决定,函数结束时销毁栈内存。不可以return 栈空间

  2.3 静态区通常放置全局变量和static变量,整个程序的生命周期都存在

3、常见的内存错误及对策

  3.1指针没有指向一块合法的内存

    int *p;

                *p =0;//错误,这里未给p指针赋值,p指向的是一个乱码(p =乱码),此时直接访问乱码对应的内存,系统会报错,无权访问

  3.2 char p[] ="abc";

                 sizeof(p) = 4,因为p这个数组保存的一个字符串常量,在字符串常量末尾有\0字符,所以p共有4字节

    char p[] ={a,b,c};//p保存的不是一个字符串常量,而是保存了字符,所以sizeof(p) =3


                char *p = "abcde";//p是一指针,指向一个字符串常量,sizeof(p) = 4(p是一指针),strlen(p)=6(字符串长度)

    char p[] = "abcde";//p是一个数组,保存一个字符串常量,sizeof(p) = 6(p是一数组名),strlen(p)=6(字符串长度)

4、内存泄露

  malloc5要素:申请多大的内存,是否有足够的空间,做什么用,给谁,在哪里开辟?

  free :free只是让系统重新获取该内存的使用权,但未清空内存的值。如free(p)后,p还是可以访问该内存,只是p不再有该内存所有权

0 0