BREW静态变量注意事项

前几天,在BREW程序中使用全局变量,在模拟器上运行的时候,模拟器报告Unknow Error(1)的错误,经过检查,文件名,clsid等都没有问题,在模拟器上调试,发现甚至都没有执行入口函数。看来是在系统运行环境的初始化问题上。想到前段时间mtk程序在全局变量的地方,不能调用内存分配,就决定先检查一下这方面。

回忆代码的修改,静态数组不太可能,因为我不确定是否会用来作为函数参数,因此,数组模板都没有默认长度,没有默认长度的话,就不会进行内存分配。接下来比较可能的就是字符串了。由于该项目中使用了大量的字符串,且都是静态变量,通过检查,我有一个变量类似这样描写了:

       String A::var = "this is a test";
       

String类是我自己写的模拟j2me的String中的大部分功能用的。在上述语句中,显然会进行内存分配,于是,将它的类型修改为char*,这下问题解决了。

看来在BREW程序中使用全局变量或者静态变量的时候,在初始化的地方,尤其是类构造的时候,需要注意这一点。延伸开来,应该避免在类的构造函数中申请内存等操作,类似下面的写法:

       class A
       {
       int* ptr1;
       int* ptr2;
       public:
        A()
        {
        ptr1 = new int[10];
        ptr2 = new int[10];
        }
        virtual ~A()
        {
        if (ptr1) {
        delete[] ptr1;
        }
        if (ptr2) {
        delete[] ptr2;
        }
        }
       };
       

上述的问题在于,当类A被new出来的时候,成员变量ptr1,ptr2可能未能正确的被填充为0,而在ptr1或者ptr2其中任意一个未能分配出内存的时候,在类的析构函数中,可能会出现内存非法访问的问题。说起析构函数,在BREW中,全局变量或者静态变量的析构函数可以正常的进行内存释放,而MTK,没记错的话,貌似不可以。BREW程序的这个机制实现的初衷比较让人费解,不过,如果可以避免使用的话,还是尽量避免的好。

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据