函数范围的静态变量如何导致与共享库中函数代码的未来使用不兼容

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数范围的静态变量如何导致与共享库中函数代码的未来使用不兼容相关的知识,希望对你有一定的参考价值。

HIC++ Coding标准的规则3.3.1限制使用具有静态存储持续时间的变量,即使它们在块作用域中声明也是如此:

具有静态存储持续时间的块作用域对象的初始化顺序已明确定义。但是,这样的对象的寿命在程序终止时结束,这可能与代码的未来使用不兼容,例如:作为共享库。

Application const & theApp()  
{  
  static  Application  app; // Non-Compliant  
  return  app;  
}

问题是不兼容会发生什么。

答案

问题是不兼容会发生什么。

作为示例,该库可能在​​多线程程序中变得不可用,在多线程程序中,在调用exit之前并非所有线程都被终止。

也就是说,如果线程T0调用了exit,则将在某个时候调用Application析构函数(因为它是在第一次调用atexit时在theApp()中注册的。)>

如果线程T1仍在运行,并且具有对theApp.app的引用,那么现在它将具有对销毁对象的引用,并且很可能会崩溃。

以上是关于函数范围的静态变量如何导致与共享库中函数代码的未来使用不兼容的主要内容,如果未能解决你的问题,请参考以下文章

如何在运行时确定共享库中全局变量的地址范围?

C ++释放共享库中动态分配的内存导致崩溃

C++ 静态库中的共享全局变量:Linux

gcc找不到静态库中的函数

如何修复警告:函数范围的静态 __shared__ 变量不支持动态初始化?

如何使用cmake生成基于静态库的动态链接库