C++ 内存分配

1.静态区

     静态变量和全局变量

         static的作用:

         1.作用于全局变量,限定该全局变量仅仅在本文件中可用 

         2.作用于局部变量,比如  

int fun(){
    static int count = 10; //在第一次进入这个函数的时候,变量a被初始化为10!并接着自减1,以后每次进入该函数,a
    return count--; //就不会被再次初始化了,仅进行自减1的操作;在static发明前,要达到同样的功能,则只能使用全局变量:    
}

  

  多次调用fun的时候,count不会被多次初始化
     3.静态变量和全局变量被默认初始化为0,即所有位都为0
     4.用于类 类的静态成员函数是属于整个类而非类的对象,所以它没有this指针,这就导致了它仅能访问类的静态数据和静态成员函数

     什么时候用静态成员函数和静态成员变量
     成员函数:
     does it make sense to call this method, even if no Obj has been constructed yet
     成员变量:
     只和类有关,和object无关,
     好处:节省内存,因为所有object都用同一块内存,但是如果只创建一个对象,,其实没区别

2.栈区内存

     自动分配的内存,比如局部变量,函数参数,在结束作用域过后自动回收
     用得最多的就是这一块

3.堆区内存(包括自由存储区)
     用new或者malloc分配出来的内存,需要手动delete或者free,不会由程序自己释放,如果不手动delete或者free的话有可能在结束的时候由os释放
     典型内存泄露

     fun() {
       Class* a = new Class();
     }
     然后循环调用fun()
     就算是有new和delete也不能保证完全不内存泄露,比如

     try {
          Class* a = new Class;
          ***
          delete a;
     }

     catch(...) {***}

              

如果在***的时候出错然后直接跳到catch了,还是会内存泄露,解决方法:优化new,delete,或者智能指针
     delete之后记得a = nullptr,否则a的值是一个野指针,好习惯
     new和malloc区别
     1.过程不同,new 根据对象来分配内存,绑定的是对象,new的步骤是,申请内存空间 + 调用构造函数,如果其中一步失败就会bad alloc,因此,new 返回的结果是Class本身类型的指针,对应的,delete的时候也会调用析构函数
     2.malloc根据内存空间大小来分配,因此返回的指针是void *型的,需要转换,malloc分配失败不会报错,会返回nullptr
     3.new可以重载,malloc不能重载
     4.有人说new分配的在自由区域,malloc分配的在堆区,个人认为只是C和C++的不同概念而已,性质是一样的,据说部分编译器在new内部调用malloc分配内存(未考证)

     delete和delete []
     对于基本类型,delete a和delete [] a是一模一样的,
     int* a = new int[10];
     delete a和delete [] a都不会出问题
     对于自定类型,int* a = new Class[10]
     delete a只会调用a[0]的析构函数,所以会造成内存泄露,同时,如果a++过后再调
     delete [] a还是有泄露,因为a的值已经改变了,第一个元素不会被析构,内存也不会释放

4.常量内存区
     存放常量的,,比如
     char* p = "test";
     p[0] = "a";
     会报错,因为p指向的是常量内存区,不能修改
     char * a = "11";
     char * b = "11";
     a和b的值是一样的
    

5.代码区

     没什么好说的,,,

 

猜你喜欢

转载自blog.csdn.net/loubiao9212/article/details/84977106