内存管理与释放

一、内存分区
在一个C/C++的程序中,用户使用的内存主要分为以下几个部分:
栈区(stack区)、堆区、全局(静态)存储区、文字常量区、代码区(段)
1、堆:由程序员手动分配和释放,完全不同于数据结构中的堆,分配方式类似链表;
由malloc©或new(C++)来分配,free©或delete(C++)释放。若程序员不释放,程序结束后由系统释放。
2、栈:由编译器自动分配和释放的,存放函数的参数值、局部变量的值等;操作方式类似数据结构中的栈。
3、全局(静态)存储区:存放全局变量和静态变量。
包括DATA段(全局初始化区)与BSS段(全局未初始化区)
4、文字常量区:常量字符串就是放在这,程序结束后由系统自动释放。
5、程序代码区:存放函数体的二进制代码
二、C语言内存操作函数
每一个程序在执行的时候都占用一块可用的内存空间,用于存放动态分配的对象,此内存空间称为程序的自由存储区或堆。
C语言程序使用一对标准函数malloc和free在自由存储区中分配存储空间;
C++语言则使用new和delete表达式实现相同的功能
三、const 对象的动态分配和回收
1、C++允许动态创建const 对象:

const int *pci = new const int(1024);

上述new表达式返回指向const int 对象的指针

对于类类型的const动态对象,如果该类提供了默认的构造函数,则此对象可隐式初始化

const string *pcs = new const string;

new表达式没有显式初始化pcs所指向的对象,而是隐式的将pcs所指向的对象初始化为空的string 对象。
内置类型对象或者未提供默认构造函数的类类型对象必须显式初始化。

2、删除const对象
尽管程序员不能改变const对象的值,但可撤销对象本身。
与其他动态对象一样,const动态对象也是使用删除指针来释放的;

delete pci;

四、malloc/free与new/delete的区别
1、相同点:都可用于申请动态内存和释放内存
2、不同点:
①:malloc/free是C/C++语言的标准库函数,new/delete是C++的运算符
②:malloc/free需要库文件支持,new/delete则不需要
③:new自动计算需要分配的空间,而malloc需要手工计算字节数
④:new是类型安全的,而malloc不是;比如:

int* p = new float[2];//编译时指出错误
itn* p = (int*)malloc(2*sizeof(double));//编译时无法指出错误

⑤:new调用operator new 分配足够的空间,并调用相关对象的构造函数,而malloc不能调用构造函数;
delete将调用该实例的析构函数,然后调用类的operator delete 以释放该实例占用的空间,而free不能调用析构函数
五、堆与栈的区别
①管理方式的不同:栈是编译器自动管理的,堆需手动释放
②空间大小不同:在32位OS下,堆的内存可达到4GB的空间,而栈就小的可怜
③能否产生碎片不同:对于栈来说不会产生碎片,而堆容易产生碎片
④生长方向不同:栈是向下生长,以降序分配内存地址;
堆是向上生长,以升序分配内在地址
⑤分配方式不同:堆动态分配,无静态分配
⑥分配效率不同:堆的效率要比栈低很多

六、内存溢出、内存泄漏
内存溢出:是指程序在申请内存的时候,没有足够的内存空间,占用有用内存
内存越界:是指向系统申请一块内存后,使用时却超出申请范围
内存泄漏:是指程序在申请内存后,无法释放已申请的内存空间,占用有用内存;
注:内存泄露最终会导致内存溢出
内存泄露分为4类:
1、常发性内存泄漏
引起内存泄漏的代码会被执行很多次,每次执行的时候都会导致内存泄漏
2、偶发性内存泄漏
在某些特定的环境下执行引起内存泄漏的代码,才会引起内存泄漏
从上述两种内存泄漏的方式来看,测试环境和测试方法在程序生命周期的重要性是不可或缺的
3、一次性内存泄漏
代码只会执行一次,但总有一块内存发生泄漏,多见于构造类的时候,析构函数没有释放内存。
4、隐式泄漏
程序运行过程中不断的分配内存,直到结束时才释放内存,但一般服务器程序会运行较长时间,不及时释放也会导致内存耗光以至于内存泄漏

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值