Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
动态库是否会破坏C++;标准 C++标准 3.63_C++_Dll_Shared Libraries_Language Lawyer - Fatal编程技术网

动态库是否会破坏C++;标准 C++标准 3.63

动态库是否会破坏C++;标准 C++标准 3.63,c++,dll,shared-libraries,language-lawyer,C++,Dll,Shared Libraries,Language Lawyer,作为从main返回的结果和调用exit的结果,调用静态持续时间的初始化对象的析构函数 在windows上,您有FreeLibrary,在linux上,您有dlclose来卸载动态链接的库。您可以在从main返回之前调用这些函数 卸载共享库的一个副作用是运行库中定义的静态对象的所有析构函数 这意味着违反了C++标准,因为这些析构函数过早地运行了吗?< /强> < p>这是个毫无意义的问题。C++标准没有说明 dLCONCE/应该做什么。 如果本标准包含dlclose的规范,它肯定会指出dlcl

作为从main返回的结果和调用exit的结果,调用静态持续时间的初始化对象的析构函数

在windows上,您有FreeLibrary,在linux上,您有dlclose来卸载动态链接的库。您可以在从main返回之前调用这些函数

卸载共享库的一个副作用是运行库中定义的静态对象的所有析构函数


<强>这意味着违反了C++标准,因为这些析构函数过早地运行了吗?< /强>

< p>这是个毫无意义的问题。C++标准没有说明<代码> dLCONCE/<代码>应该做什么。 如果本标准包含
dlclose
的规范,它肯定会指出
dlclose
是3.6.3的一个例外。因此,不会违反3.6.3,因为这是一个记录在案的异常。但我们不能知道,因为它不包括它

<>代码> > dLCOX/<代码>对C++标准中的保证有什么影响,只是超出了该标准的范围。因为代码没有任何说明,所以<代码> > dLCONCE/<代码>可以违反C++标准。
(如果这是在程序没有执行任何特定的调用操作的情况下发生的,那么您会有一个合理的理由认为标准被违反了。)

如果您付出很大的努力,它们只会过早地运行-默认行为是符合标准的。

我认为这是一个有点开放性的问题

我想说是这样的:标准只定义了程序是什么。一个程序(我应该加上一个“托管”程序)是一个编译和链接翻译单元的集合,它有一个唯一的
main
入口点

共享库没有这样的东西,所以它甚至不构成标准意义上的“程序”。它只是一堆链接的可执行代码,没有任何形式的“流”。如果使用加载时链接,库将成为程序的一部分,并且一切都如预期的那样。但是如果使用运行时链接,情况就不同了


因此,您可能希望这样看待它:运行时链接的共享对象中的全局变量本质上是由动态加载程序构造的动态对象,在卸载库时会被销毁。事实上,这些对象被声明为全局对象并不会改变这一点,因为对象不是该程序的一部分。

PARAPULA,记住C++标准是一个语言定义,它对编译器如何将源代码转换为目标代码的约束是有帮助的。 该标准没有对操作系统、硬件或其他任何东西施加约束

如果用户关闭他的机器,这是违反C++标准的吗?当然不是。标准是否需要将“除非用户关闭设备电源”作为每个规则的“例外”?那太傻了

同样,如果一个操作系统杀死一个进程或强制释放一些系统资源,或者甚至允许第三方程序破坏数据结构——这不是违反C++标准。它很可能是OS中的一个bug,但是C++语言定义仍然完好无损。
该标准仅对编译器进行绑定,并强制生成的可执行代码具有某些属性。然而,它并不绑定运行时行为,这就是为什么我们在异常处理上花费如此多的时间

如果确实违反了标准,谁是违反者?C++编译器不能被认为是违反者(因为通过库调用动态加载东西);因此,它必须是动态加载功能的供应商,也就是操作系统供应商。在设计系统时,OS厂商是否受C++标准约束?这似乎超出了标准的范围。

或者从另一个角度考虑,库本身是一个单独的程序,提供某种服务。当该程序终止时(无论以何种方式卸载库),那么所有相关的服务对象也应该消失,不管是静态的还是非静态的。

这只是众多平台特定的“扩展”(针对目标编译器、体系结构、操作系统等)中的一个。所有这些都以各种方式“违反”了标准。但偏离标准C++只有一个预期结果:您不再具有可移植性。(除非你做了大量的#ifdef之类的事情,但是,特定的代码仍然锁定在该平台上)


由于目前没有标准/跨平台的库概念,如果您想要此功能,您必须不使用它或根据平台重新实现它。由于大多数平台上都出现了类似的东西,也许有一天标准会找到一种干净的方法来抽象它们,以便标准涵盖它们。优势在于跨平台的解决方案,它将简化跨平台代码。

C++标准没有对库说什么。它的范围只是一个单独的程序。因此,共享库本身超出了标准的范围,你对它所做的任何事情都是如此,就像青少年性行为一样。每个人都想这样做,没人知道每天都是怎样发生的。你不应该谈论它。我不知道你还希望从中得到什么。运行时链接库不是标准C++的一部分。我的烤萨尔萨食谱也不一样,但你找不到权威的消息来源这么说。没有人真正回答这个问题。是的。标准明确规定,在main和dlclose执行静态析构函数之前,不能运行静态析构函数。不是吗?标准不是这样工作的。标准说明了发生了什么,但它们从不排除你可以明确表达的可能性