【问题标题】:Delete Not Doing Anything? [duplicate]删除不做任何事情? [复制]
【发布时间】:2014-08-01 20:46:37
【问题描述】:

如果这是一个太基本的问题或者它很常见,我深表歉意 - 我在这里以及在 Google 上搜索都没有运气。

我正在尝试删除二叉树中的一个节点,但删除运算符似乎什么也没做。

这是我的节点:

struct node {

    node(int value) : left(NULL), right(NULL), quantity(1) { val = value; }

    int val;
    int quantity;
    node* left;
    node* right;

}

还有我的测试代码:

node* test = new node(15);
cout<<test<<'\n'; //Outputs memory address
cout<<test->val<<'\n'; //Outputs 15

delete test;
cout<<test<<'\n'; //Outputs same memory address
cout<<test->val<<'\n'; //Outputs 15

非常感谢任何帮助!我查看了文档,并没有看到任何关于批量内存清理的信息,这表明它会在以后被清理。

【问题讨论】:

  • 访问刚刚删除的内容是未定义的行为。 delete 就像它说的那样释放内存,如果你有一个日志析构函数,你会看到刚刚执行的delete 的输出并被刷新。内存中是否还有旧的东西在任何方面都不可靠。
  • delete 通常所做的只是破坏对象并使内存块有资格重复使用,因此稍后对new 的调用可能会收到相同的地址(或块的地址无论如何,它包括相同的内存——可能是同一块的子集或超集)。这并不意味着内容一定会立即消失(尽管可能)。
  • 阅读此问题的答案。基本上是一样的。 stackoverflow.com/questions/6441218/…
  • 我没有意识到 newdelete 被添加到 C...
  • 也许只是我厌倦了人们将问题标记为 C 和 C++,而这显然是其中之一

标签: c++ memory


【解决方案1】:

删除节点将该空间标记为可重新分配。它没有清除它。旧值将保留在那里,直到它被重新分配并且它的新所有者写入它。

在内存被释放后写入内存是未定义的行为——这意味着任何事情都可能发生,“任何事情”包括“没有什么异常”。

如果您将其更改为:

delete test;
node* test2 = new node(55);
cout<<test<<'\n'; //Outputs same memory address
cout<<test->val<<'\n'; //Outputs 15

那么你会看到不同的东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多