现在的位置: 首页 > 综合 > 正文

关于vp中的内存自动回收机制的看法

2013年11月30日 ⁄ 综合 ⁄ 共 645字 ⁄ 字号 评论关闭

    在vp中,采用了对指针指向内存的自动回收机制。在vp中,所有的vp的类实例都有一个计数器,用来存放实例当前被引用的次数。当创建一个实例之后,这个实例的引用数被自动设置成0,如果这个实例被别的实例所引用,则计数器自动加1。反之,计数器减1。当计数器的值为0时,则实例的内存被自动删除。vp会对实例计数器的增加分为显世和隐式,显示通常是用户在代码中调用ref()函数实现。当使用完毕时,调用unref()函数使计数器减1。隐式一般是在这个实例被加载到了别的父节点上时,计数器会自动加1。当从父节点删除时,会自动减1。例如,你动态创建了一个channel,这时计数器的值为0,然后把它加入到某个windows的下面,则计数器加1;反之,当你把它从windows下面删除的时候,则计数器自动减1,当计数器的值为0,则自动回收。

  看起来,好像有这么个机制似乎很好。如,你在你的构造函数中把vp的类实例初始化,并且手动计数器加1。在类的析构函数中,使计数器减1。这样,当你的主线程推出之前,vp便会把计数器为0的实例的内存自动回收。并且,由于最后在析构函数中才手动减掉了构造函数中加的1,这样也可以保证类实例有着健全的生命周期。但,如果vp的类实例只是被引用一次的话,我想这个机制也就没什么意义了,但在多次引用中,每次都让用户手工加加减减,难免写错造成内存泄露,还不如直接让用户new和delete来的便捷。当然,加加减减后还有个vuAllocTracer类实例帮你检查是否泄露,这还是不错的。

 

抱歉!评论已关闭.