您实际上需要问我们真正的问题(a) :-) 您可能很清楚为什么您认为这是必要的,但几乎可以肯定不是。事实上,这几乎总是一个坏主意。换句话说,你为什么认为你需要这样做?
我通常发现这是因为开发人员希望根据分配的位置删除或不删除对象,但这通常应该留给代码的客户端而不是代码本身。
更新:
既然您已经在问题中阐明了您的原因,我很抱歉,您可能已经找到了您所要求的少数几个领域之一(运行您自己的垃圾收集过程)。理想情况下,您将覆盖所有内存分配和取消分配运算符,以跟踪从堆中创建和删除的内容。
但是,我不确定拦截类的 new/delete 是否简单,因为可能存在delete
未调用的情况,并且由于 mark/sweep 依赖于引用计数,因此您需要能够拦截指针分配使其正常工作。
你有没有想过你将如何处理它?
经典例子:
myobject *x = new xclass();
x = 0;
不会导致删除调用。
此外,您将如何检测指向您的实例之一的指针在堆栈上的事实?拦截 new 和 delete 可以让您存储对象本身是基于堆栈还是基于堆的,但我不知道如何判断指针将被分配到哪里,尤其是使用如下代码:
myobject *x1 = new xclass(); // yes, calls new.
myobject *x2 = x; // no, it doesn't.
也许您可能想研究 C++ 的智能指针,它在很大程度上使手动内存管理过时。共享指针本身仍然会遇到循环依赖等问题,但明智地使用弱指针可以轻松解决这个问题。
在您的方案中可能不再需要手动垃圾收集。
(a)这被称为X/Y problem
. 很多时候,人们会提出一个预先假定有一类解决方案的问题,而更好的方法只是描述问题,而不预先考虑最佳解决方案是什么。