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

时间:2012-09-13 14:38:00

标签: c++ design-patterns memory-management static-members

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

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

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

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:5)

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指令来自第一个 - 不要忘记!),并且第一次其中一个对象被初始化,它将调用代码来初始化库。 (请注意,此代码不是线程安全的;使其线程安全很简单)

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