我已经构建了一个自定义数据结构,就像一个双向链接的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而不是指针,但这似乎没有改变任何东西......
编辑:我的问题是,删除任何甚至所有节点后,我都没有看到任何内存使用量下降。我应该以不同的方式处理吗?
答案 0 :(得分:3)
我检查过,如果我在返回之前尝试访问任何节点n数据,它仍然存在......
delete n;
std::cout << n->color_ID<<"\n\n";
删除后解除引用n
具有未定义的行为。
我应该为它构建自定义析构函数吗?
没有。除非n_message
拥有它指向的内存,否则隐式析构函数会泄漏该内存。
我的问题是,删除任何甚至所有节点后,我都没有看到内存使用量下降。
malloc
的大多数实现(通常用于new
实现的动态内存分配)永远不会将释放的内存返回给操作系统。相反,它会将其重新用于后续分配。这不是问题。
我应该采用不同的方式处理吗?
除了摆脱有UB的“检查”,没有。一切似乎都符合预期。
答案 1 :(得分:2)
delete
只释放内存并调用对象的析构函数。它不会擦除内存或做任何类似的事情。除非你有某些需要(例如安全性),否则浪费时间和代码。在delete
之后,你可以(显然是)仍然指向记忆并取消引用它。这是非常危险的,因为它是未定义的行为。