【问题标题】:What would cause delete to leave garbage values in data fields of my class?什么会导致删除在我的班级的数据字段中留下垃圾值?
【发布时间】:2011-12-20 21:12:04
【问题描述】:

我有一个包含 3 个节点指针和 2 个整数的节点类。我用new 分配所有节点,但是当我在它们上调用delete 时,整数被设置为-17891602,它搞砸了我代码的其余边界检查。什么会导致delete 这样做?

【问题讨论】:

  • 你能分享你的代码吗?
  • 没有看到一些代码很难知道。也许您的析构函数中有错误?
  • 为什么在调用delete 之后还要检查内存内容?你不应该那样做。delete 不保证在内存位置写入任何特定内容。许多 delete 实现会故意写入特定垃圾以帮助检测错误,例如在调用 delete 后访问内存。

标签: c++ class delete-operator garbage


【解决方案1】:

delete 之后,那段记忆不再属于你了。不要检查它,不要对它做任何事情,因为如果你这样做了,那么你就有了未定义的行为。它可能很快就会被重复使用。

【讨论】:

  • 补充一点,许多编译器在调试版本中会故意将垃圾写入已释放的内存中,以便更容易发现您访问不应该拥有的内容。
  • 在我看来,yemathums 是说删除节点的指针成员会更改整数成员。他没有检查已删除的内存(据他所知)。
【解决方案2】:

检查指针字段是否也获得新值。它们等于 0xfeeefeee 吗? (即十六进制的 -17891602。)您的内存管理器可能正在覆盖已释放的内存,因此当您尝试读取或写入您不应再访问的内存时,更容易在故障转储中识别。

如果您正在读取已释放的对象以进行边界检查,那么您依赖于未定义的行为。检查您的环境的文档以了解它对释放内存的作用(如果有的话)。您的边界检查器需要与它合作;你不能假设它会在一般情况下工作。

【讨论】:

    【解决方案3】:

    如果您在 Linux 上开发并使用 gdb,您可以使用 watch 命令将观察点放置到 GDB。这有助于查找内存位置何时被覆盖。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-09
      • 2011-02-12
      • 2019-02-24
      • 1970-01-01
      • 2013-09-15
      • 1970-01-01
      • 2012-07-22
      相关资源
      最近更新 更多