C++内存管理

C++内存管理

本篇为笔记 


一  基础部分  

1.c++内存分为5个区:栈,堆,自由存储区(与堆类似,用malloc分配,free释放)全局/静态存储区,常量存储区


堆与栈:

       1、管理方式不同;

  2、空间大小不同;

  3、能否产生碎片不同;

  4、生长方向不同;

  5、分配方式不同;

  6、分配效率不同;

  管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生memory leak。

  空间大小:一般来讲在32位系统下,堆内存可以达到4G的空间,从这个角度来看堆内存几乎是没有什么限制的。但是对于栈来讲,一般都是有一定的空间大小的,例如,在VC6下面,默认的栈空间大小是1M(好像是,记不清楚了)。当然,我们可以修改:

  打开工程,依次操作菜单如下:Project->Setting->Link,在Category 中选中Output,然后在Reserve中设定堆栈的最大值和commit。

  注意:reserve最小值为4Byte;commit是保留在虚拟内存的页文件里面,它设置的较大会使栈开辟较大的值,可能增加内存的开销和启动时间。

  碎片问题:对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。对于栈来讲,则不会存在这个问题,因为栈是先进后出的队列,他们是如此的一一对应,以至于永远都不可能有一个内存块从栈中间弹出,在他弹出之前,在他上面的后进的栈内容已经被弹出,详细的可以参考数据结构,这里我们就不再一一讨论了。

  生长方向:对于堆来讲,生长方向是向上的,也就是向着内存地址增加的方向;对于栈来讲,它的生长方向是向下的,是向着内存地址减小的方向增长。

  分配方式:堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由alloca函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由编译器进行释放,无需我们手工实现。

  分配效率:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是C/C++函数库提供的,它的机制是很复杂的,例如为了分配一块内存,库函数会按照一定的算法(具体的算法可以参考数据结构/操作系统)在堆内存中搜索可用的足够大小的空间,如果没有足够大小的空间(可能是由于内存碎片太多),就有可能调用系统功能去增加程序数据段的内存空间,这样就有机会分到足够大小的内存,然后进行返回。显然,堆的效率比栈要低得多。


2.控制内存分配,一种重载全局操作符new 和 delete

void* operator  new(size_t size)

{

void *p = malloc(size)

return (p)

}

另一种重载 单个类的new delete 操作符



3.常见内存错误 

     1)内存分配未成功 却是用,对策是分配完内存先检测是否NULL

     2)内存分配成功但未初始化就使用 

     3)内存分配成功已初始化,但操作越界

     4) 忘记释放内存,导致内存泄漏

     5)释放了内存却使用它



4.指针与数组对比

数组存储空间在静态存储区或栈上,指针可以指向任意类型的内存块

1)修改内容,数组内容可以更改,而指针指向的内容更改取决于内存类型,如果指向常量区是不可以更改的

2)内容复制与比较  数组赋值需要将数组值逐一赋值(strcpy memcpy)  数组比较(比较值strcmp)直接比较是比较数组地址

3)计算内存容量 sizeof可以直接计算出数组的容量 但数组作为参数传递时会自动退化为同类型的指针

4)指针传递内存 应该用指向指针的指针传递内存


5.杜绝野指针 



6.malloc/free 和 new/delete 


7.内存耗尽



二 强指针和资源管理

资源的定义:任何在程序获得并在此后释放的东西

规则一:指针,句柄,临界区状态只有我们将它封装入对象的时候才有拥有者

规则二:智能指针

规则三:资源传递(不同作用域)   把资源存放在资源池中

规则四:强指针   强指针类似智能指针,超出作用域会清楚他所指的对象,资源传递以强指针赋值的方式进行  和智能指针非常类似,它重载了赋值和拷贝构造函数

规则五:Parser  智能指针在子类智能指针与父类智能指针之间不能直接转换,通过传值构造函数类来向上映射

规则六:Transfer Semantics (转移语义?)转移了资源所有权,剥夺原有对象资源所有权

规则七:  Strong Vectors 

规则八:Code Inspection 代码审查

规则九:共享所有权 (引用计数)

规则十:所有权网络

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值