C++内存管理

本文详细介绍了C和C++在内存区域划分上的相似之处和差异,包括内核空间栈、动态内存分配函数如malloc、calloc、realloc和free,以及C++特有的new、delete和operatornew、operatordelete。重点讨论了C++的异常处理机制和内存管理优势,以及C与C++在动态申请内存时的不同点。
摘要由CSDN通过智能技术生成

一:C与C++的内存区域划分

C与C++的内存区域划分都是一样的,都把内存空间划分为六个区域:

内核空间
函数,以及局部变量
内存映射段
动态申请内存(molloc,relloc等)
数据段(静态区)静态变量,全局变量(static等)
代码段(常量区)常量

二:C与C++的动态内存管理的介绍

C++兼容C语言的内存管理方式,简单回顾C语言动态内存管理方式:

malloc(类型)malloc(类型*个数)
calloc(类型)calloc(创建个数,类型)(会自动初始化为0)
realloc(类型)realloc(原先的地址,进行空间操作之后的内存大小)
freefree(要销毁的变量)

在C++中重新引用进了两个操作符:new,delete.

用法:new+类型(初始化的值)/  new+类型[个数]{要初始化的值}   

          delete +变量  /  delete[要进行销毁的个数]  +变量

         

PS:一般情况下,new对所创建的不进行初始化,但是可以自己手动对其进行初始化,并且操作符除了用法方便,与C的用法无太大差别

对于自定义类型,new和delete的优势才真正地显现出来

功能:对于自定义类型,使用new时会自动调用构造函数,使用delete会自动调用析构函数

扩容:C++在进行扩容时,没有使用realloc的概念,而是自己手动地对其进行扩容

三:operator new与operator delete函数

PS:operator new 与operator delete 为两个全局函数,实际上是malloc与free的封装

例如:A* p2 = new A ;    ==     operator new(本质还是在使用malloc在开空间)  + 构造函数

           delete p2;    ==   析构函数 + operator delete

四:C与C++内存管理的区别

C与C++的动态内存管理主要区别是在底层调用的时候

(1)C++在动态申请内存时,如果失败会直接抛异常,不需要再进行返回值的检查(主要是因为其是封装了malloc+抛异常)

(2)C语言的动态申请内存是使用函数,而C++使用的是两个操作符

PS:最好C语言的和C语言的配套使用,C++的和C++的进行配套使用

原因:使用new的时候有时会多开空间存放要创建的对象个数,提醒后面要进行调用析构函数的次数,但往往返回值会往后移四个字节,此时如果使用free会造成内存泄漏

(显式写出析构函数的情况下会多开空间,只有delete[] 会自动向前偏移四个字节的位置)

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值