动态库之全局对象、静态对象

来源:互联网 发布:怎样开电信网络电视 编辑:程序博客网 时间:2024/05/03 12:12
我们都知道,全局对象是相对局部对象、静态对象而言的,具体的定义如下:
局部对象就是只在局部使用比如在函数里,复合语句里,出了局部环境就不存在了。  
静态对象分为静态全局对象和静态局部对象:静态局部对象和局部对象的用法类似,但其在退出整个程序时,才消失,不象局部对象出了局部环境就不存在了;静态全局对象只在其申明的文件内是全局的,其它文件不能访问,其也是退出整个程序时,才消失。
全局对象对整个程序是可见的。其也是退出整个程序时,才消失。
对于一个应用程序来说,上面的说明已经足够清楚了,但是对应动态连接库中的全局对象、静态对象是如何分配内存和使用的呢?今天测试程序遇到的问题使我彻底明白了其关系。
首先说明一下动态库结构,有一个接口类CInterface和全局对象goMap,goMap是一个保存数据的map表,由于许多类需要使用,所以使用了全局对象。
我是这样调用动态库的,先通过Create接口创建接口类CInterface的对象(new方法),然后调用Open填充goMap的数据、并打开各类线程进行工作;当我只创建了一个动态库对象时没有发生问题,而后的测试需要创建4个动态库对象时却出现了错误;我分别每个动态库对象的goMap保存信息进行了输出,发现它们的内容完全一样了,都变成了最后一次填充的数据,而实际上每次填充的数据是完全不同。
也就是说,虽然我使用了动态库且new出接口类对象,但动态库中的全局对象仍然只有一个,所以被多次清除和填充数据了。从这点看,设计模式之Singleton(单态),无论是在应用程序还是其调用的动态库,也应该只有一份,大家可以共享其应用的。
另外,还测试了一下静态变量。测试使用静态变量初始化后自增长,如下代码:
 static int l_iTemp = 0;
 return l_iTemp++;
创建了多个动态库,但发现实际上l_iTemp仅初始化了一次;也就是说动态库类的成员函数中,静态变量也是共用一个内存地址的。
通过以上测试,彻底明白了动态库和应用程序在处理全局对象、静态对象时没有差别;那局部对象也应当是没有差别的了。
 
转自: http://blog.sina.com.cn/s/blog_5378b28301000bat.html
0 0
原创粉丝点击