我正在使用第三方API来覆盖C运行时库中的内存管理功能。为了使一切正常工作,我必须在进行任何内存分配之前调用初始化API。
我正在处理的项目使用一个静态Factory对象,该对象在执行主文件中的任何代码之前动态初始化。
如何确保在静态Factory对象之前初始化API?
答案 0 :(得分:5)
您应该将静态工厂对象初始化移动到静态函数,并在安装第三方库之后调用该函数作为main中的第一件事。
答案 1 :(得分:5)
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指令来自第一个 - 不要忘记!),并且第一次其中一个对象被初始化,它将调用代码来初始化库。 (请注意,此代码不是线程安全的;使其线程安全很简单)
这被称为“漂亮的反击技巧”。