代码之家  ›  专栏  ›  技术社区  ›  c-urchin

无效的*读取*释放的内存会导致内存损坏吗?

  •  2
  • c-urchin  · 技术社区  · 16 年前

    我要走了

    我在valgrind手下做过调查报告 已释放的内存,但没有非法内存的情况 写入 .

    6 回复  |  直到 16 年前
        1
  •  5
  •   Tarantula    16 年前

    您可以使用GDB监视此内存地址中的每次写入,如下所示:

    (gdb) watch *((int*)0xf28000fa)
    

    阅读不会导致记忆的损坏,但是有很多情况你甚至想象不到这可能是原因,而Valgrind并不是一个完美的工具。

    here

        2
  •  2
  •   Brian Hooper    16 年前

    它不会破坏您读取的内存,但不会对程序的运行产生奇迹。

        3
  •  1
  •   Andrei    16 年前
        4
  •  1
  •   casablanca    16 年前

    不,读取无效位置不可能导致您看到的错误。如果地址空间中的位置是有效的,那么你只是在读垃圾,如果不是,那么你会得到一个分段错误。

        5
  •  1
  •   6502    16 年前

    大约30年前,我被它咬了一口,因为我的错误读取引发了内存库切换(即内存的每个字节,包括包含代码的区域,都在该指令之后获得了一个新的不同值)。 有趣的是,这不是一个真正的“无意”的坏阅读。。。事实上,我做了阅读,即使知道这将是垃圾,因为这节省了我一些汇编指令。。。不是明智之举。

        6
  •  0
  •   Juraj    16 年前

    真正可能发生的是,free可以使用madvise(MADV\u DONTNEED)syscall告诉内核“我不需要这个页面,放弃它”(参见madvise(2)manpage)。如果该页面真的被释放,并且您从中读取了任何内容,那么内核将静默地提供新的页面,并将其归零,从而导致您的应用程序遇到完全意外的数据!