网站大量收购闲置独家精品文档,联系QQ:2885784924

C++内存管理详细分析.docx

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
C内存管理详细分析

C++内存管理详解l?内存分配方式在C++中,内存分成5个区,分别是堆、栈、自由存储区、全局/静态区和常量存储区.栈:存放函数参数以及局部变量,在出作用域时,将自动被释放.栈内存分配运算内置于处理器的指令集中,效率很高,但分配的内存容量有限.堆:new分配的内存块(包括数组,类实例等),需delete手动释放.如果未释放,在整个程序结束后,OS会帮你回收掉.自由存储区:malloc分配的内存块,需free手动释放.它和堆有些相似.全局/静态区:全局变量(global)和静态变量(static)存于此处.(在以前的C语言中,全局变量又分为初始化的和未初始化的,C++不分)常量存储区:常量(const)存于此处,此存储区不可修改.l?堆与栈的区别void f(){ int *p = new int[5];}上面一段代码就包含了堆与栈.指针P被分配在了栈中,而new出来的东西则被分配在了堆中,此句可以解释为”在栈中存放了一个指向堆内存的指针p”.(可否理解为:指针p的值是堆内存块的首地址??????)?主要区别:管理方式不同:?栈是编译器自动管理的,堆需手动释放空间大小不同:?在32位OS下,堆内存可达到4GB的的空间,而栈就小得可怜.(VC6中,栈默认大小是1M,当然,你可以修改它)能否产生碎片不同:对于栈来说,进栈/出栈都有着严格的顺序(先进后出),不会产生碎片;而堆频繁的new/delete,会造成内存空间的不连续,容易产生碎片.生长方向不同:栈向下生长,以降序分配内存地址;堆向上生长,以升序分配内在地址.分配方式不同:堆动态分配,无静态分配;栈分为静态分配和动态分配,比如局部变量的分配,就是动态分配(alloca函数),函数参数的分配就是动态分配(我想的…).分配效率不同:栈是系统提供的数据结构,计算机会在底层对栈提供支持,进栈/出栈都有专门的指令,这就决定了栈的效率比较高.堆则不然,它由C/C++函数库提供,机制复杂,堆的效率要比栈低得多.可以看出,栈的效率要比堆高很多,所以,推荐大家尽量用栈.不过,虽然栈有如此多的好处,但远没有堆使用灵活.l?控制C++的内存分配其实C++的内存管理容易而且安全,因为当一个对象消除时,它的析构函数能够安全的释放所有分配的内存.在嵌入式系统中,内存的分配是一个常见问题,保守的使用内存分配是嵌入式环境中的第一原则.当你需使用new/delete时,一个防止堆破碎的通用方法是从不同固定大小的内存池中分配不同类型的对象(??????).对每个类重载new和delete就提供了这样的控制.class TestClass{ void *operator new(size_t size); void operator delete(void *p);};void *TestClass::operator new(size_t size){ void *p = malloc(size); return p;}void TestClass::operator delete(void *p){ free(p);}而对象数组的分配又不同于单个对象的分配,所以你仍需再重载new[]和delete[]操作符.但值得注意的是,对于C++而言,分配对象数组的大小等于数组参数的大小再加上额外的对象数目的一些字节,所以要尽量避免使用对象数组.class TestClass{ void *operator new[](size_t size); void operator delete[](void *p);};void *TestClass::operator new[](size_t size){ void *p = malloc(size); return p;}void TestClass::operator delete[](void *p){ free(p);}void main(){ TestClass *p = new TestClass[10]; delete[] p;}l?常见的内存错误及对策2?内存分配未成功,却使用了它解决办法:在使用之前检查指针是否为NULL,如果指针p是函数参数,那么在函数入口处assert(p!=NULL).如果是用malloc或new申请的话,应该用if(p==NULL)进行防错处理.2?内存分配成功,但未初始化就使用它?解决办法:不要嫌麻烦,记得初始化就行了.2?内存分配成功且已初始化,但操作越过了边界?解决办法:此问题通常出现于循环之中,注意不要多1或少1就行.2?忘记释放内存?解决办法:含有这个错误的函数每调用一次就丢失一块内存,造成内存耗尽.记得free或delete就行.2?释放了内存却继续使用它有三种情况:※程序中对象的关系过于复杂,难以搞清哪个对象是否已经释放了

文档评论(0)

yan698698 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档