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

C++ pointer struct does not get deleted

本文关键字:删除 指针 结构 C++      更新时间:2023-10-16

>我构建了一个自定义数据结构,类似于双链接的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;

当我调用我的 remove 函数时,我在返回之前以delete n结束。我检查了一下,如果我在返回之前尝试访问任何node n数据,它仍然存在......

即我称之为:

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

它确实返回节点颜色

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

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

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

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

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

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

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

不。除非n_message拥有它所指向的内存,在这种情况下,隐式析构函数将泄漏该内存。

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

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

我应该以不同的方式处理它吗?

除了摆脱具有UB的"检查"之外,没有。一切似乎都如预期的那样。

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