如何在win32下将全局变量实例化为c++中的第一件事?
How do you get a global var to be instantiated as the very first thing in C++ under win32?
我在Windows上,我正在用VS2008构建一个c++项目。我试图取代新的/删除/malloc/自由等。这是有效的,也就是说,我的替代者正在被召唤。
但是我的替换分配器需要初始化。到目前为止,我已经将它定义为.cpp文件中的全局变量,其中定义了#pragma init_seg(lib)。
这个问题直到最近std::locale开始被初始化,在我的分配器被初始化之前调用new。因此,我紧张地将分配器的全局变量移动到编译器段,即#pragma init_seg(编译器)。
这工作了一点,然后我决定覆盖malloc。现在我在_tmainCRTStartup中的__crtGetStringTypeA_stat中得到一个malloc调用,这甚至是在编译器段中的全局变量被初始化之前。
有没有办法让我的变量在CRT启动之前实例化。我唯一能想到的是重建我的crt库,并尝试一些如何插入我的初始化代码在那里的一些地方。我想应该还有一个crt清理功能吧?
是否有更容易的途径和/或我在这里错过的一些明显的东西?
您正在使用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;
}
现在你的new/delete/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
和朋友)。
- 为什么make_tie不是一件事
- 不知道如何在家庭作业任务中实现一件事
- C++警告:编译指示在主文件中一次
- MFC Applicaton:如何将一组控件添加到单个文档应用程序中
- <<是一件C++的事情 - 相当于Java。
- 为什么会这样?堆,展示了一件事,然后又展示了另一件事
- 使用windows.h是一件好事吗?
- C++:关于加载 DLL 和调用函数的一件小事
- 虚拟析构函数会是一件坏事吗?
- 引用或复制结构的结构(已分配的memset)是一件有效的事情
- 我在wxPaint DC绘图中发现了一件奇怪的事情
- 通过多重私有继承扩展类-这是一件事吗
- 加工va_list一件一件
- 没有明显目标的std::cout在已发布代码中是一件不好的事情吗?
- 状态检查总是一件有效的事情吗
- 递归是一件坏事吗?在递归似乎最有用的地方,是否有更清晰或更有效的方法来解决问题?
- 使用 cpp 宏作为脚本语言是一件坏事吗?
- 指针强制转换以满足方法参数是一件危险的事情吗?
- 如何在Windows上每毫秒做一件事或做得更好
- 我做了一件阴暗的事情