你如何获得一个全局variables被实例化为win32下C ++的第一件事情?

Windows上,我正在用VS2008构build一个C ++项目。 我试图更换新/删除/ malloc /免费等。这是工作,即我的替代品被调用。

但是我的replace分配器需要被初始化。 到目前为止,我已经通过在.cpp文件中将其定义为一个全局variables,并在其中定义了#pragma init_seg(lib)来做到这一点。

直到最近,当std :: locale开始初始化,在我的分配器被初始化之前调用新的时候,这个问题一直持续着。 所以我紧张地把我的分配器的全局variables移到编译器段,即#pragma init_seg(compiler)。

这工作了一下,然后我决定重写malloc。 现在,我在_tmainCRTStartup的__crtGetStringTypeA_stat中调用一个malloc,即使编译器段中的全局variables已经被初始化。

有没有办法让我的variables在CRT启动之前被实例化。 我能想到的唯一的事情就是重build我的crt库并尝试一些如何将我的初始化代码插入到那里。 我认为还必须有一个crt清理function?

有没有更容易的路线和/或明显的我在这里失踪?

您正在使用static storage duration对象。

但是你的初始化顺序有问题。
要解决这个问题,请使用在函数范围内定义的静态存储持续时间对象。

 MyAllocator& getAllocator() { static MyAllocator allocator; // Note the static here. // It has the appropriate lifespan and will be destoryed. // and is automatically constructed the first time this // function is called. return allocator; } 

现在你的新版本/删除/ etc可以通过调用getAllocator()来获得对分配器的引用。 这将保证对象被正确初始化(假设MyAllocator具有正确的构造函数)。

在Windows上,你可以使用InitOnceExecuteOnce来初始化你的分配器。 例如:

 static INIT_ONCE initFlag = INIT_ONCE_STATIC_INIT; static BOOL CALLBACK InitMyHeap(PINIT_ONCE InitOnce, PVOID Parameter, PVOID *Context) { *Context = (PVOID)CreateMyHeap(); } MyHeap *GetMyHeap() { PVOID vpMyHeap; if (!InitOnceExecuteOnce(&initFlag, InitMyHeap, NULL, *vpMyHeap)) { abort(); } return (MyHeap *)vpMyHeap; } 

有了这个,你的堆将在GetMyHeap()之后被初始化一次。 你的new / delete / malloc重载应该调用GetMyHeap()来获得一个指向堆结构的指针(或者简单地确保堆被初始化)。 即使使用多线程,即使在CRT初始化之前,这也是安全的,因为initFlag是数据段中的静态数据,并且不需要构造函数调用。

请注意,当然, CreateMyHeap()必须小心,不要使用CRT服务; 直接调用Windows DLL函数(即kernel32.dll和朋友)。