C ++指针结构不会被删除

时间:2017-01-14 20:25:20

标签: c++ struct nodes

我已经构建了一个自定义数据结构,就像一个双向链接的RBTree,虽然逻辑似乎很好,但是当我删除节点时,我看不到任何内存被释放。

这是我的节点声明:

typedef struct rbtreere_node
{

public:
    NMessage *n_message;

    // Node Specific //
    enum color color_ID;    //<<--- Color for ID side of RBTreeRe
    enum color color_Price; //<<--- Color for Price side of RBTreeRe
    int id;                 //<<--- Unique Identifier.
    rbtreere_node *left_ID, *right_ID, *parent_ID, *left_Price, *right_Price, *parent_Price;

}*node;

当我调用我的删除功能时,在返回之前我以delete n结束。 我检查过,如果我在返回之前尝试访问任何node n数据,它仍然存在...

即。我这称之为:

delete n;
std::cout << n->color_ID<<"\n\n";

它确实返回节点颜色

我应该为它构建自定义析构函数吗?

我还有node message作为var而不是指针,但这似乎没有改变任何东西......

编辑:我的问题是,删除任何甚至所有节点后,我都没有看到任何内存使用量下降。我应该以不同的方式处理吗?

2 个答案:

答案 0 :(得分:3)

  

我检查过,如果我在返回之前尝试访问任何节点n数据,它仍然存在......

delete n;
std::cout << n->color_ID<<"\n\n";

删除后解除引用n具有未定义的行为。

  

我应该为它构建自定义析构函数吗?

没有。除非n_message拥有它指向的内存,否则隐式析构函数会泄漏该内存。

  

我的问题是,删除任何甚至所有节点后,我都没有看到内存使用量下降。

malloc的大多数实现(通常用于new实现的动态内存分配)永远不会将释放的内存返回给操作系统。相反,它会将其重新用于后续分配。这不是问题。

  

我应该采用不同的方式处理吗?

除了摆脱有UB的“检查”,没有。一切似乎都符合预期。

答案 1 :(得分:2)

delete只释放内存并调用对象的析构函数。它不会擦除内存或做任何类似的事情。除非你有某些需要(例如安全性),否则浪费时间和代码。在delete之后,你可以(显然是)仍然指向记忆并取消引用它。这是非常危险的,因为它是未定义的行为。