C ++删除运算符的工作原理是什么/如何

时间:2013-11-15 16:31:23

标签: c++

当我们在指针上调用delete时,它会调用对象的析构函数,但是在析构函数之后它会释放对象所指向的内存。如果我们在类中覆盖delete运算符,那么我们如何做原始delete运算符与实际释放内存相同的事情呢?

我在考虑垃圾收集和智能指针。如果我们覆盖类删除操作符,是否有可能以某种方式实际释放内存的默认删除功能(复制/粘贴默认的删除操作符代码)?

是的,我只是在玩弄B ++。这不是特定的任何事情。只是试图了解这种可能性。

我讨厌模板化的智能指针,并且很乐意尝试实现智能指针,这些指针允许您仍然使用普通的删除操作符,而不使用模板化的类将指针包装进去。

1 个答案:

答案 0 :(得分:1)

删除操作符如何释放内存取决于如何 相应的新运营商获得了它。如果你正在实施 特定于类的运算符,您可能需要同时实现它们 (或两者都没有)。在这种情况下,您可以使用::operator new来获取 记忆,::operator delete释放它。

如果您正在考虑更换全局运营商new和 运营商删除,您可以使用mallocfree进行分配。 在形式上,这些是唯一保证不使用的功能 newdelete自己(但这是一个不错的选择 像memset这样的函数也没有。)

如果您对垃圾收集感兴趣,当然,operator new将从垃圾收集的舞台分配,并且 operator delete将成为无操作者。 (我已经使用了这个 Boehm收藏家,它运作得很好。)你可以这样做 逐个班级,或者你可以在全球范围内完成。如果你这样做 这个,你没有delete,除非你的程序逻辑 需要它。但请注意,垃圾收集器 打电话给你的析构函数。如果析构函数是微不足道的,或者只是 用于内存管理(因此已被包含在内 垃圾收集器),这很好,通常就是这种情况。

您无法改变的一件事是new运算符会 调用构造函数(假设类型具有非平凡的类型), 在调用operator newdelete运算符之后 在调用operator delete之前会调用析构函数。