您需要实际询问我们
真正的问题
(a) :- )。您认为这是必要的,但它几乎肯定
不是。实际上,这几乎总是个坏主意。换句话说,您认为为什么需要这样做?
我通常发现,这是因为开发人员想要根据对象分配的位置删除或不删除对象,但这通常应留给代码的客户端而不是代码本身来处理。
更新:
既然您在问题中澄清了原因,那我道歉,您可能已经找到了很少几个需要这样做的领域(运行自己的垃圾回收进程)。理想情况下,您需要覆盖所有内存分配和释放运算符以跟踪从堆中创建和删除的内容。
然而,我不确定是否简单地拦截类的new/delete操作,因为有些情况下可能不会调用delete,而且由于标记/扫描依赖于引用计数,因此您需要能够拦截指针赋值才能使其正常工作。
您考虑过如何处理这个问题吗?
经典的例子:
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问题”。很多时候,人们会提出一个预设解决方案的问题,而更好的方法是只描述问题本身,不要预先设想最佳解决方案。