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.代码区
没什么好说的,,,