0

我正在使用第 3 方 API 来覆盖 C 运行时库中的内存管理功能。为了让一切正常工作,我必须在进行任何内存分配之前调用初始化 API。

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

如何确保在静态工厂对象之前初始化 API?

4

2 回答 2

6

C++ 标准库遇到了同样的问题:它必须确保在任何代码(包括静态对象的构造函数)使用它们之前初始化 、 等cincout为处理这种情况而发明的技巧也可以解决您的问题。在每个翻译单元中首先包含的头文件中(嗯,每个翻译单元都有带有动态初始化器的静态对象):

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 指令首先出现- 不要忘记这一点!),并且当这些对象中的一个第一次被初始化时,它将调用代码来初始化图书馆。(请注意,此代码不是线程安全的;使其成为线程安全的很简单)

这被称为“漂亮的反技巧”。

于 2012-09-13T15:40:35.470 回答
5

您应该将静态工厂对象初始化移动到静态函数,并在将第 3 方库初始化为 main 中的第一件事后调用该函数。

于 2012-09-13T14:40:40.580 回答