2013-04-24 97 views
0
main() 
{  
int *p; 

free(p); 
} 

此代码在Win 2K中崩溃。但不知何故不会在Win XP中崩溃!任何想法为什么?C++代码在Win 2000中崩溃但不会在Win xp中崩溃

编辑:是的。这是一个错误,不应该写入。 更多信息:使用的编译器是VC 6编译器。在Win Xp机器上以发行模式编译代码。在具有Win Xp的多台机器上使用此代码运行可执行文件。代码没有导致任何崩溃。但在多台Win 2K机器上运行相同的代码。它每次都坠毁!

+1

您正在玩俄罗斯轮盘赌。你永远不知道下一个镜头什么时候会有真正的子弹。 – Mysticial 2013-04-24 09:21:16

+0

当然,这不是完整的代码!? http://sscce.org/ – 2013-04-24 09:21:39

+0

我知道它的一个错误。我想知道的是,Win 2k的Win Xp在堆栈管理和类似的东西方面有多不同。如果是相反的话,我会很高兴 - 在Win Xp上崩溃而不在Win 2K上。 – Alerter 2013-04-24 09:26:29

回答

6

这是未定义的行为。它可能会崩溃,可能不会崩溃,甚至可能画出独角兽,但未定义行为的行为方式并没有规定。

+0

在我工作的产品上有一个类似的代码。它从未在Win Xp机器上崩溃。但是每次在Win 2K上相同的代码都会崩溃!这是我感兴趣的! :) – Alerter 2013-04-24 09:28:03

+0

@Alerter只是用NULL初始化它,一切都会好的。 – alexrider 2013-04-24 09:30:30

+0

@Alerter。这可能是侥幸......指针被分配为寄存器或堆栈。编译器没有义务在它创建它时为你清零指针...所以它已经创建,但是直到你专门用一个值或NULL初始化指针,它才能指向任何地方。所以如果它没有崩溃,那就意味着a)你很幸运,指针的内容恰好是NULL,b)你很幸运,初始指针值指向一个允许你“释放”的内存区域,可能会导致其他问题你rprogram – Jimbo 2013-04-24 09:31:25

1

您的代码是未定义行为:您正试图使用​​(实际上是免费的)未初始化的指针。

既然这是UB,那么尝试和理解它为什么在一个操作系统上运行(或者看起来)是完全不相干的:UB的原理是“所有投注都关闭,任何事情都可能发生“。

0

这就是它的代码吗?也就是说,在初始化p之间没有任何内容。

作为一个猜测,我会说在你的XP系统上,编译器正在将p初始化为NULL(我不认为它只是)。在2K系统上,编译器只是将* p添加到堆栈,值可以是任何值。

Free(p)将正确处理NULL指针,但是如果您的2K系统在堆栈上创建指针时没有将指针调零(我认为C标准不需要),那么它可能是dnagling ,因此free(p)可能试图释放一些任意的内存,导致你的问题。

如果你开始

int *p = NULL; 
free(p); 

这并不改变行为?