【发布时间】:2011-11-18 22:10:26
【问题描述】:
进程地址空间中未使用的内存是否仅通过读取权限来保护,例如,写入单元化指针指向的位置总是会导致页面错误被操作系统捕获?或者不是这样,除了代码之外的每个内存位置(当然是只读访问),都被赋予了写访问权限?
我问这个是因为我的朋友向我展示了他的代码,他没有初始化指针并写入指针指向的内存,但他的程序仍然没有因为 windows 的 mingw gcc 编译器而崩溃,但总是崩溃在 mac 或 linux 中使用 Visual c++。
我认为操作系统不保护未使用区域的内存并且导致崩溃是因为在 mingw 生成的代码中,随机指针值指向一些已使用的区域,例如堆栈、堆或代码,而在其他情况下,它指向一些空闲区域。但是如果操作系统真的不保护未使用的区域,那么这些类型的错误,例如未初始化的指针,是不是很难调试?
我想这就是为什么建议在调用delete 或free 后始终将NULL 分配给指针,这样当使用它访问某些内容时,它确实会导致可见的崩溃。
【问题讨论】:
-
是的,未初始化的指针错误很难调试。症状往往非常神秘。如果你发现自己说“代码不可能那样做……”,怀疑是未初始化的指针。
-
观察到的编译器之间的差异可能与未初始化指针的初始化对象有关。从编译器的角度来看,一种“安全”的方法是将所有指针初始化为 NULL - 这样,如果您使用它,您将导致段错误而不是指向内存中的随机位置......但这是特定于实现的,可能会解释你观察到了什么。
标签: c linux operating-system