您的位置:首页 > 编程语言 > C语言/C++

c++内存分配(堆栈 new malloc)和内存常见错误

2017-04-12 22:06 288 查看
内存分配

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
(t);delete[] a;  

     T  (*a)
=new int[M]
;//这样就可以构造二维的“数组”

     在运行时能确定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内存管理

发生内存错误是件非常麻烦的事情。编译器不能自动发现这些错误,通常是在程序

运行时才能捕捉到。而这些错误大多没有明显的症状,时隐时现,增加了改错的难度。

有时用户怒气冲冲地把你找来,程序却没有发生任何问题,你一走,错误又发作了。

常见的内存错误及其对策如下:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: