【发布时间】:2013-03-03 18:23:03
【问题描述】:
int main()
{
int *a; // a = 0x4053c6 (a random address)
// this will cause the program to exit, and how do i know this memory can't be written ?
*a = 5;
return 0;
}
困惑!我的意思是这个 sn-p 是否总是导致程序崩溃?还有这个程序可以从头到尾执行的情况吗?
【问题讨论】:
-
您必须自己跟踪。在这种情况下,您知道
a未初始化,因此读取该指针值是未定义的行为(更不用说写入其延迟位置)。 -
我知道
a未初始化。大多数编译器会报告警告。但是,我想知道*a = 5是否有机会执行。 -
@Ggicci:是的,有机会 - 未定义的行为意味着任何事情都可能发生。如果可能是巧合,
a持有例如它自己的地址和*a因此是一个有效的写入位置(据限制程序的操作系统所知)。尽管如此,如果a碰巧拥有自己的地址,但不能保证它会起作用……对于未定义的行为,没有任何保证。还有其他无害的可能性 - 例如。a可以轻松指向一些当前未使用的堆栈空间。 -
@Cgicci - 如果您编写愚蠢的代码,预计会发生愚蠢的事情。只需编写代码并确保不会发生内存泄漏。使用编译器警告、purify/valgrid 和测试等应用程序。
-
@GManNickG,这不是 C++ 异常,而是陷阱 (SEH)。一些系统将这些称为异常 (Windows)。
标签: c++ exception memory-leaks