在Windows中初始化静态全局变量时,new返回NULL?

时间:2010-02-12 01:08:41

标签: c++ windows memory new-operator

我正在努力将rLog与我们的代码库集成,并且我注意到Windows上没有我在Linux上的问题。在头文件中,我有一个静态变量,它给我一个“详细”的日志记录通道(基本上是一个调试),这样定义:

static RLogChannel *rlog_verbose = DEF_CHANNEL("verbose", Log_Debug);

在Linux上没有问题,但是在Windows上,一旦应用程序启动就会出现错误。

我已将其追踪到rLog库中的这一行:

RLogChannel *rlog::GetComponentChannel(const char *component, const char* path, LogLevel levl) {
...
if(!gRootChannel)
    gRootChannel = new RLogChannel( "", level );
...
}

问题是对new的调用返回一个NULL指针,该指针未经检查 并且程序在访问时会立即崩溃。是否有与在Windows上的全局上下文中分配内存相关的规则,我不会离开?

编辑:我很确定这必须与静态对象的初始化顺序有关。我想确保我没有遗漏一些显而易见的东西:Windows上的内存分配。谢谢大家!

3 个答案:

答案 0 :(得分:4)

你确定它返回null。它可能是整个静态初始化器的东西。静态初始化程序调用的顺序未在文件之间定义。如果你有使用rlog_verbose的静态代码,那么gRootCHannel很可能只是因为初始化程序还没有被调用。

答案 1 :(得分:1)

new不返回NULL。如果失败,则抛出std::bad_alloc异常。即使它在静态数据初始化中也会发生这种情况,这实际上是在入口点CRT函数中调用的,后来调用main()

你看到的NULL可能就在那里,因为new从未被调用过。要验证它是否实际被调用,您可以简单地在静态初始化上放置一个断点,并查看它何时发生。

答案 2 :(得分:0)

new不会返回null。因此,您的问题必须是在静态初始化程序执行之前使用rlog_verbose。您的静态初始化程序可能从不执行。 (这将是一个链接问题)

您需要启动调试器并在静态初始化程序和main上以及崩溃的代码行上设置中断,并查看发生的情况。如果你跨过崩溃它是否有效?是main之前发生的崩溃?