Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.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++_Design Patterns_Memory Management_Static Members - Fatal编程技术网

C++ 在静态成员分配之前调用函数

C++ 在静态成员分配之前调用函数,c++,design-patterns,memory-management,static-members,C++,Design Patterns,Memory Management,Static Members,我使用的第三方API覆盖了C运行库中的内存管理函数。为了让一切正常工作,我必须在内存分配发生之前调用初始化API 我正在处理的项目使用一个静态工厂对象,该对象在执行主文件中的任何代码之前动态初始化 如何将API初始化为静态工厂对象?< /P> < P>,您应该将静态工厂对象初始化移动到静态函数,并在初始化第三方LIB后作为初始事项调用该函数。 < P> C++标准库运行到相同的问题:它必须确保CIN,CUT,在任何代码(包括静态对象的构造函数)使用它们之前初始化。为处理这种情况而发明的技巧也可以

我使用的第三方API覆盖了C运行库中的内存管理函数。为了让一切正常工作,我必须在内存分配发生之前调用初始化API

我正在处理的项目使用一个静态工厂对象,该对象在执行主文件中的任何代码之前动态初始化


如何将API初始化为静态工厂对象?< /P> < P>,您应该将静态工厂对象初始化移动到静态函数,并在初始化第三方LIB后作为初始事项调用该函数。

< P> C++标准库运行到相同的问题:它必须确保CIN,CUT,在任何代码(包括静态对象的构造函数)使用它们之前初始化。为处理这种情况而发明的技巧也可以解决你的问题。在每个翻译单元中首先包含的头文件中,每个具有带有动态初始值设定项的静态对象的翻译单元:

class init_library {
public:
    init_library() { if (counter++ == 0) initilaize_the_library(); }
private:
    static int counter;
};

static init_library i_library;
在一个翻译单元中,您必须提供init_library::counter的定义

这将把init_library类型的静态对象放在每个导入头的翻译单元中。它的初始化将在同一翻译单元中的任何其他初始化之前发生,因为它的include指令首先出现-别忘了!,第一次初始化其中一个对象时,它将调用代码来初始化库。请注意,此代码不是线程安全的;使其线程安全非常简单


这就是所谓的“漂亮的计数器”把戏。

真的那么简单吗?据我所知,没有任何内部对象正在初始化工厂对象。@德里克,静态对象是由在main之前运行的隐藏代码初始化的,除非它们是函数的本地对象,并且您无法控制它们的初始化顺序。在执行代码块之前,代码块本地的静态不会初始化。。。除非它们是本地的,在这种情况下,它们在第一次调用函数时被初始化,否则它们是本地的to@Derek-是,分配与初始化是分开的。分配必须在初始化之前进行,否则就没有什么可初始化的。当然,除非它们是本地的。这里的问题主要围绕着文件静态对象,我真的不想用这个限定词来干扰讨论。你不能保证全局静态的初始化顺序。函数本地静态在使用之前已初始化,因此通常可以将全局静态放入实例函数中,然后可以控制调用它们的顺序。@BoBTFish工厂对象是类的静态成员。这会改变什么吗?就初始化顺序而言,它不会改变任何东西。你是对的。在Visual Studio中,_initterm将初始化与标准库关联的静态成员。我认为静态分配是可以的,但是动态分配会让API不舒服。酷,+1,但是正如你所说的,它不是线程安全的。我在一个基于AIX的超级计算机上运行的库,在系统升级之后,在IBM +编译器+ LIBs的最后升级之后,MPI在初始化我的C++库之前和在main之前生成线程,所以我的全局静态工厂中的代码崩溃了。因此,我将所有这些静态全局工厂移动到一个函数中,客户机代码在使用我的库之前必须调用该函数。问题已解决。@Derek-是的,有编译器特定的钩子来控制初始化和清理。这就是为什么我说的是发明的技巧,而不是使用的技巧。+1表示编译器特定的钩子。“我一直在试图弄明白_initterm背后的魔力。@Derek-它是由Jerry Schwarz发明的,他是cfront的iostreams库的设计者和实现者。