C++ gcc能否将未初始化的指针初始化为NULL?或者怎样解释这种行为?

C++ gcc能否将未初始化的指针初始化为NULL?或者怎样解释这种行为?,c++,pointers,gcc,initialization,sunstudio,C++,Pointers,Gcc,Initialization,Sunstudio,gcc能否以某种方式初始化指向NULL的未初始化指针 在工作中,我们在GCC4.1.2以及Sun Studio 12上构建软件。运行在Red Hat Enterprise Linux上的gcc版本已经运行了好几个月,每周运行5天 我们刚刚推出了Solaris版本,但它每天在启动时都会崩溃 堆栈跟踪将我们带入如下代码: if( _timer == NULL ) { _timer = new Timer(bunch, of, parameters); } _timer->StartTi

gcc
能否以某种方式初始化指向
NULL
的未初始化指针

在工作中,我们在GCC4.1.2以及Sun Studio 12上构建软件。运行在Red Hat Enterprise Linux上的gcc版本已经运行了好几个月,每周运行5天

我们刚刚推出了Solaris版本,但它每天在启动时都会崩溃

堆栈跟踪将我们带入如下代码:

if( _timer == NULL ) {
    _timer = new Timer(bunch, of, parameters);
}
_timer->StartTimer(_timeout);
我们已经确定,
\u timer
没有在任何地方初始化。因此,我们认为必须将
\u timer
设置为垃圾数据,该数据无法与
NULL
进行比较,然后在不构造计时器的情况下获取
StartTimer

这项工作实际上是分配给我的同事的,他正在验证这一点。但与此同时,我很好奇:为什么我们的Linux(gcc)构建没有崩溃?我可以向你保证,这和我们使用的性能和严格的标签代码是一样的。我读到编译器不会初始化未初始化的指针,所以我感到困惑


确认
gcc 4.1.2
绝对不能自动初始化未初始化的指针,即可回答此问题。或者,可能是这样。

哦,
NULL
可能是我公司的一个定义。它等于0。这是未定义的行为,UB的一个症状似乎起作用。是_计时器变量还是类成员?它是在堆栈上还是在全局范围内?静态还是自动?@AndrewCheong可能是在一个平台上,OS内存管理器始终提供0个初始化内存页(比如出于安全原因),也可能是两个平台上的二进制ABI不同,因此它选择了不同的位置/值。UB并不意味着随机行为,事实上,考虑到计算机的确定性行为,如果它在单个平台上是随机的,我会感到惊讶。@AndrewCheong这是否可能可能取决于其他代码的功能,例如它是否取消引用
\u timer
。例如,如果执行
\u timer->foo()
并且
foo
执行
if(this==NULL)返回,代码可能不会在一个实现上崩溃,但在另一个实现上,它允许编译器假定
\u timer
不为空。(从技术上讲,您已经取消了对计时器的引用,但许多平台即使为空也不会崩溃。)因此,如果没有看到代码,我们真的不能说。