【发布时间】:2010-02-12 01:08:40
【问题描述】:
我正在努力将 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 上的内存分配。谢谢大家!
【问题讨论】:
-
new不能返回 null。你的意思是它抛出一个异常? -
您是否检查过代码是否实际执行了,或者 gRootChannel 是否在其他地方只是 NULL?
-
这两段代码有什么联系?第一个变量名是
rlog_verbose,第二个变量名是gRootChannel。有什么联系?有吗? -
抱歉,更新得更清楚一点,代码的 sn-p 位于一个因使用 DEF_CHANNEL 宏而被调用的函数中。 @GMan:我不知道 new 抛出了异常,很高兴知道,但我看到对 0x00000000 的无效写入,所以它一定不是 new 调用。可能与静态初始化程序的顺序有关...
-
@GMan:在 Visual Studio 6 中,如果出现错误,new 会返回 NULL。 @gct:你用的是哪个版本的VS?
标签: c++ windows memory new-operator