C++ 内存分配和new delete的使用

内存划分

在C++中内存分为5个区,分别是堆、栈、全局/静态存储区、常量存储区和代码区。

栈:保存局部变量。栈空间用来存放函数运行时的参数值和局部变量,当一个函数运行结束时,在这个函数中声明的局部变量也会自动销毁。栈的特点是无需人工管理但空间大小有限。

堆:由malloc(C++程序员因避免使用)或者new运算符分配的内存。其生命周期由free(和malloc对应)或delete(释放new分配的空间)决定。堆中占用的空间在没有释放之前会一直存在,直到程序结束。堆的特点是自由度高,空间比较大,但程序员必须通过代码释放,容易出错。

静态区:保存全局变量和static变量(包括static全局和static局部变量)。静态区的内容在整个程序的生命周期内都存在,由编译器在编译的时候分配。

常量存储区:这是一块比较特殊的存储区,他们里面存放的是常量(const),不允许修改。

代码区:存放函数体的二进制代码。

在这里插入图片描述
new运算符不仅会分配大小正确的内存空间,而且还会返回新空间的地址,最后地址信息被保存在=前面声明的指针中。

空指针指向的内存区域为内存的首地址,是不可读写的区域,即空指针不提供操作。删除空指针是安全的(因为它什么也没做)。

C++标准规定:delete空指针是合法的,没有副作用。所以我们在Delete指针后赋值为NULL或0是个好习惯。对一个非空指针delete后,若没有赋NULL,若再次delete的话有可能出现问题。

int *ptr = new int(3);
delete ptr;
ptr = NULL;

可以看出delete是释放指针指向的内存,并不是指针本身所占有的内存。所以delete后,指针的还是指向那块区域,并未清0,所以如果下次用到,就会发生xxx空间不能访问的异常。以后delete后要赋值为空。

  1. c++中指针的内存申请和内存释放问题
  2. delete释放字符串指针_C++ 指针:内存管理,收放成双
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值