bada开发基础之内存管理

原创 2011年10月15日 17:54:18

1.两阶段构造

为了防止内存泄露,bada在构造对象时使用了两阶段构造,个人觉得bada的内存管理很大程度上借鉴了symbian。先让我们来看看bada文档上这段代码:

class SimpleClass;  
class ComplexClass
{    
    public:       
        ComplexClass(void)       
        {          
            p1 = new SimpleClass();          
            p2 = new SimpleClass(); // Out-of-memory error       
        }       
         ~ComplexClass(void)      
         {         
             delete p1; delete p2;       
        }     

    private:       
        SimpleClass* p1;       
        SimpleClass* p2;
};  

void MyClass::SomeFunction()
{    

        // 调用构造函数,如果这里内存分配失败,其析构函数将不会被调用,也就是说会造成内存泄露
        ComplexClass a;
}

class TwoPhaseClass
{   
public:      
        TwoPhaseClass(void): p1(null), p2(null) { }      
        ~TwoPhaseClass(void)      
        {         
                delete p1;         
                delete p2;      
        }      

        result Construct(void)      
        {         
                p1 = new SimpleClass();         
                if(null == p1)         
                {            
                        return E_OUT_OF_MEMORY;         
                }        
   
                //这里如果p2构造失败将调用p2的析构函数
                p2 = new SimpleClass();         
                if(null == p2)         
                 {            
                        delete p2;            
                        return E_OUT_OF_MEMORY;         
                 }         

                 return E_SUCCESS;      
        }   
  
        private:      
                SimpleClass* p1;      
                SimpleClass* p2;
        };  

        void MyClass::SomeFunction()
        {   
                // 第一阶段:调用构造函数,只是分配空间,这里不会抛出异常   
               TwoPhaseClass a;

                //第二阶段:调用Construct()方法,这里会构造两个SimpleClass实例
                result r = a.Construct();

                //方法结束,这里会调用a的析构函数,这里编译器会为你加上a.~TwoPhaseClass(),只是你看不见罢了
        }


以上代码直接从baba文档里拿来的,只是让大家了解一下baba的两阶段构造,不过说实话bada的编程规范实在不敢恭维


2.对象所有权策略(Object Ownership Policy)

在bada中,获得对象所有权有两个规则:

(1)new操作符会获得刚分配空间的所有权

(2)对象所有权可以被转移但不能共享,其实开发者也可以使用shared pointer只是bada SDK中他是这么要求自己的。


这是主要想说是bada系统中特有的N后缀,我们经常会看到有些方法的后缀是N后缀的,这里就是对象所有转移了,方法调用者要自己删除。

class A 
{    
public:       
    IList* SearchN(const String& criteria) const;     
    // Other methods declared here 
}; 

 IList* A::SearchN(const String& criteria) 
{    
    // Search with criteria and return the results by storing them in the list    
    ArrayList* pList = new ArrayList();     // Add the search results to the list     
    return pList; 
}  
void MyClass::SomeMethod(void) 
{    
    A a;   
    IList* pList = a.SearchN(L"Most popular");    // 要删除list    
    delete pList; 
}




收藏助手
不良信息举报
您举报文章:bada开发基础之内存管理
举报原因:
原因补充:

(最多只允许输入30个字)