内存分配
1 常量存储区(注意:不能用进行修改!)
2静态存储区(全局 satic)
3 堆
4 栈
堆和栈的区别:
(1 )堆是new delete建立,需要自己释放容易出现内存泄漏,栈由编辑器维护,结束时自动释放。
(2)堆的空间大高达4G,new delete造成内存不连接,存在碎片;栈空间有限,先入后出不产生碎片。
(3)生长方向不同
4 new delete
new 完成了开辟空间和初始后的工作,然后将这段地址返回。
T * a=new T (t); delete a; //初始化为t
T * a=new T[N](t);delete[] a;
T (*a)[N]=new int[M][N];//这样就可以构造二维的“数组”
在运行时能确定N就可以了,可以是变量,表达式,或者函数调用。
注意动态开辟了内存大小为sizeof(T) 和 N *sizeof(T),
当开辟不成功,可能a=NULL或者有的会报错。
当开辟的内存不足时,即存放的数据》开辟的内存时,再用a访问也会越界,运行时出现异常。
0x77...处有未经处理的异常:0xC0000374,堆已损坏
delete free只是内存释放,指针还存在,变成野指针!!!
5 c中malloc free
malloc 则必须要由我们计算字节数,并且在返回后强行转换为实际类型的指针。
int* p;
p = (int *) malloc (sizeof(int)*128);//分配128个(可根据实际需要替换该数值)整型存储单元,并将这128个连续的整型存储单元的首地址存储到指针变量p中
double *pd=(double *) malloc (sizeof(double)*12);//分配12个double型存储单元,并将首地址存储到指针变量pd中
malloc 只管分配内存,并不能对所得的内存进行初始化,所以得到的一片新内存中,其值将是随机的。
6区别:
都是建立在堆上,开辟释放动态内存
区别: 对于非基本数据类型,malloc 不能完成初始化和析构。
malloc/free属于c++/C标准库函数,不受编译器的
new delete 属于运算符
c函数只能使用malloc free处理
7来自高质量的C++/C编程指南第7内存管理
发生内存错误是件非常麻烦的事情。编译器不能自动发现这些错误,通常是在程序
运行时才能捕捉到。而这些错误大多没有明显的症状,时隐时现,增加了改错的难度。
有时用户怒气冲冲地把你找来,程序却没有发生任何问题,你一走,错误又发作了。
常见的内存错误及其对策如下: