我正在使用第 3 方 API 来覆盖 C 运行时库中的内存管理功能。为了让一切正常工作,我必须在进行任何内存分配之前调用初始化 API。
我正在处理的项目使用一个静态工厂对象,该对象在执行主文件中的任何代码之前动态初始化。
如何确保在静态工厂对象之前初始化 API?
我正在使用第 3 方 API 来覆盖 C 运行时库中的内存管理功能。为了让一切正常工作,我必须在进行任何内存分配之前调用初始化 API。
我正在处理的项目使用一个静态工厂对象,该对象在执行主文件中的任何代码之前动态初始化。
如何确保在静态工厂对象之前初始化 API?
C++ 标准库遇到了同样的问题:它必须确保在任何代码(包括静态对象的构造函数)使用它们之前初始化 、 等cin
。cout
为处理这种情况而发明的技巧也可以解决您的问题。在每个翻译单元中首先包含的头文件中(嗯,每个翻译单元都有带有动态初始化器的静态对象):
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 指令首先出现- 不要忘记这一点!),并且当这些对象中的一个第一次被初始化时,它将调用代码来初始化图书馆。(请注意,此代码不是线程安全的;使其成为线程安全的很简单)
这被称为“漂亮的反技巧”。
您应该将静态工厂对象初始化移动到静态函数,并在将第 3 方库初始化为 main 中的第一件事后调用该函数。