C ++代码在Win 2000中崩溃但在Win xp中没有崩溃

时间:2013-04-24 09:19:07

标签: c++ windows-xp

main()
{       
int *p;

free(p);
}

此代码在Win 2K中崩溃。但不知何故,Win Xp不会崩溃!知道为什么吗?

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

3 个答案:

答案 0 :(得分:6)

这是未定义的行为。它可能会崩溃,可能不会崩溃,甚至无法显示独角兽,也没有关于未定义行为如何表现的规则。

答案 1 :(得分:1)

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

由于这是UB,尝试理解为什么它在一个操作系统上工作(或者更确切地说是在另一个操作系统上)而不是另一个操作系统是完全无关紧要的:UB的原则是“所有的赌注都关闭了,任何事都可以发生”。

答案 2 :(得分:0)

这正是它的代码吗?即,在初始化之间没有任何内容p?

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

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

如果你从

开始
int *p = NULL;
free(p);

这会改变行为吗?