- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
cocos2d-x内存管理机制
总结Cocos2d-x内存管理机制秦春林2014-10-15 09:35:531458 次阅读在C++中,动态内存分配是一把双刃剑,一方面,直接访问内存地址提高了应用程序的性能,与使用内存的灵活性;另一方面,由于程序没有正确地分配与释放造成的例如野指针,重复释放,内存泄漏等问题又严重影响着应用程序的稳定性。人们尝试着不同的方案去避免这个问题,比较常用的如智能指针,自动垃圾回收等,这些要么影响了应用程序的性能,要么仍然需要依赖于开发者注意一些规则,要么给开发者带来了另外一些很丑陋的用法(实际上笔者很不喜欢智能指针)。因此,优秀的C++内存管理方案需要兼顾性能,易用性,所以到目前为止C++标准都没有给出真正的内存管理方案。Cocos2d-x的内存管理机制实际上来源于Objective-C,这套机制几乎贯穿Cocos2d-x中所有的动态分配的对象。它使得管理动态分配到堆上的对象更简单,然而它独特的工作机制也使得一些开发者,尤其是不熟悉Objective-C的开发者对其造成一些”误解”。确保完整的理解,以及正确地使用Cocos2d-x的内存管理机制,是使用Cocos2d-x必须具备的基础准备工作。一、C++显式堆内存管理C++使用new关键字在运行时给一个对象动态分配内存,并返回堆上内存的地址供应用程序访问,通过动态分配的内存需要在对象不再被使用时通过delete运算符将其内存归还给内存池。显式的内存管理在性能上有一定优势,但是极其容易出错,事实上,我们总是不能通过人的思维去保证一个逻辑的正确。不能正确处理堆内存的分配与释放通常会导致以下一些问题:野指针:指针指向的内存单元已经被释放,但是其他一些指针可能还指向它,这些内存可能已经被重新分配给其他对象,从而导致不可预测的结果。重复释放:重复释放一个已经被释放的内存单元,或者释放一个野指针(也是重复释放)都会导致C++运行时错误。内存泄漏:不再被使用的内存单元如果不被释放就会一直占用内存单元,如果这些操作不断重复就会导致内存占用不断增加,在游戏中内存泄漏尤其严重,因为可能每一帧都在创建一个永远不会被回收的游戏对象。二、C++11中的智能指针根据用于分配内存的方法,C++有3种管理数据内存的方式:自动存储,静态存储和动态存储。其中静态存储用于存储一些整个应用程序执行期间都存在的静态变量,动态存储用于存储上一节讲述的通过new分配的内存单元。而对于在函数内部定义的常规变量则使用自动存储空间,其对应的变量称为自动变量。自动变量在所属的函数被调用时自动产生,在该函数结束时消亡。实际上,自动变量是一个局部变量,其作用域为包含它的代码块。自动变量通常存储在栈上,这意味着进入代码块时,其中的变量将依次加入到栈中,而在离开该代码块时按相反的顺序释放这些变量。由于自动变量通常不会导致内存问题,所以智能指针试图通过将一个动态分配的内存单元与一个自动变量关联,这个自动变量在离开代码块被自动释放的时候释放其内存单元,这使得程序员不再需要显式地调用delete就可以很好的管理动态分配的内存。C++11使用三种不同的智能指针,unique_ptr,shared_ptr和weak_ptr。它们都是模板类型,我们可以通过如下的方式来使用它们:123456int?main(){?unique_ptr?up1(new?int(11));?unique_ptr?up11=up1;?//编译报错?shared_ptr?up2(new?int(22));?weak_ptr?up3=up2;}每个智能指针都重载了*运算符,我们可以使用*up1这样的方式来访问所分配的堆内存。智能指针在析构或者调用reset成员的时候,都可能释放其所拥有的堆内存。三者之间的区别如下:unique_ptr不能与其他智能指针共享所指对象的内存,例如通过将up1赋值给up11将会导致编译错误。但可以通过标准库的move函数来转移unique_ptr对对象的”拥有权”,一旦转移成功,原来的unique_ptr指针就失去了对象内存的所有权,再使用则会导致运行时错误。多个shared_ptr则可以共享同一堆分配对象的内存,它在实现上采用引用计数,一旦一个shared_ptr放弃了所有权(调用了reset成员)并不会影响其他智能指针对象。只有所有引用计数归零的时候,才会真正释放所占有的堆内存的空间。weak_ptr可以用来指向shared_ptr分配的对象内存,但是却并不拥有该内存,我们可以使用其lock成员来访问其指向内存的一个shared_ptr对象,当其所指向的内存无效时,返回指针空值(nullptr)。weak_ptr通常可以用来验证shared_ptr的有效性。三、为什么不使用智能指针看起来shared_ptr是一个完美的内存管理方案,然而实际上至少有两
文档评论(0)