当我们在指针上调用delete时,它会调用对象的析构函数,但是在析构函数之后它会释放对象所指向的内存。如果我们在类中覆盖delete运算符,那么我们如何做原始delete运算符与实际释放内存相同的事情呢?
我在考虑垃圾收集和智能指针。如果我们覆盖类删除操作符,是否有可能以某种方式实际释放内存的默认删除功能(复制/粘贴默认的删除操作符代码)?
是的,我只是在玩弄B ++。这不是特定的任何事情。只是试图了解这种可能性。
我讨厌模板化的智能指针,并且很乐意尝试实现智能指针,这些指针允许您仍然使用普通的删除操作符,而不使用模板化的类将指针包装进去。
答案 0 :(得分:1)
删除操作符如何释放内存取决于如何
相应的新运营商获得了它。如果你正在实施
特定于类的运算符,您可能需要同时实现它们
(或两者都没有)。在这种情况下,您可以使用::operator new
来获取
记忆,::operator delete
释放它。
如果您正在考虑更换全局运营商new和
运营商删除,您可以使用malloc
或free
进行分配。
在形式上,这些是唯一保证不使用的功能
new
和delete
自己(但这是一个不错的选择
像memset
这样的函数也没有。)
如果您对垃圾收集感兴趣,当然,operator
new
将从垃圾收集的舞台分配,并且
operator delete
将成为无操作者。 (我已经使用了这个
Boehm收藏家,它运作得很好。)你可以这样做
逐个班级,或者你可以在全球范围内完成。如果你这样做
这个,你没有delete
,除非你的程序逻辑
需要它。但请注意,垃圾收集器不
打电话给你的析构函数。如果析构函数是微不足道的,或者只是
用于内存管理(因此已被包含在内
垃圾收集器),这很好,通常就是这种情况。
您无法改变的一件事是new
运算符会
调用构造函数(假设类型具有非平凡的类型),
在调用operator new
和delete
运算符之后
在调用operator delete
之前会调用析构函数。