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

内存分配
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内存管理

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

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

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

常见的内存错误及其对策如下:

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值