现在有dll模块A,dll模块B以及静态库C,
C中有个全局Create()函数负责创建对象M,当第二次调用Create()的时候会增加引用计数,并返回原来创建的对象M。Relase()会减少引用计数。当引用计数为0时,销毁对象M。现在在模块A中创建的初始化对象M,模块B继续调用Create(),出现在模块B中得到的对象并不是模块A所创建的对象M。想简单的通过将模块A中创建的对象M传给模块B解决问题,但在卸载A,B模块的时候会出现释放空指针的问题
具体跟踪:
当在模块A中使用静态库Create()创建对象M,在模块A中其他地方也这样使用Create(),引用计数如预料中增加,即调用两次,引用计数增加至2,并返回已经创建好的M。
但接下来,在模块B中使用静态库Create()创建对象M,会出现引用计数重新开始计数,也就是说新创建了另外个对象。
原因就是因为跨模块,此时的全局函数只能相对于模块全局。
进一步讲就是,当在模块A中引用计数这个变量,对象M的指针,以及指针所指向的内存都是在A中的heap中分配的,
而在模块B中,它们的内存却在B中的heap中分配的,当然会出现创建新对象的现象。
解决方法:需要将对象M的创建先于模块A,和模块B,然后在初始化模块A,模块B的时候将创建好的对象M传给它们使用,然后在模块A和模块B卸载后,释放对象M。注意这里Create()函数的引用计数已经不起作用了。