最近新引擎在安卓平台遇到了问题:在armlinux下编译和运行都没问题,但是在安卓上运行会崩溃。
这个问题不是我排查的,不过崩溃的原因值得记录。是因为在动态库接口里使用了stl变量。导致问题的原因有两点:
-
stl变量大多会直接或者间接地使用静态变量,而静态变量并不是全局唯一的——只是编译单元内唯一。因此,静态变量在主程序和动态库中都会有一个副本。在主程序和动态库中会访问到不同的副本。
-
主程序和动态库使用的编译器可能不一样,不同的编译器编译出来的变量内存布局可能不同。因此在主程序和动态库之间传递stl变量,可能导致访问出错。
总之,库的接口尽量不要使用stl变量。
由这个问题又想到了另一个问题:如果一个动态库同时被多个进程使用,那么其中的静态变量以及全局变量是共用的吗?答案是否定的。动态库运行时,代码段被使用的各进程共享(也就是说物理内存中只有一份),数据段是是私有的,每个进程都有自己的数据副本。
假设现在有两个进程都使用了一个动态库,库接口中使用了stl变量,该stl变量使用了静态变量a,那么实际上会有四个a:每个进程都有一份动态库的数据副本,共有有两个;两个进程的主程序又各自有一份,加起来就是4份。
参考资料
本文由 晓楼 创作,采用 知识共享署名4.0 国际许可协议进行许可。本站文章除注明转载/出处外,均为本站原创或翻译,转载前注明出处