我在设计将使用自己的内存分配的适当类时遇到了一些麻烦。考虑一下:
class IAbstract { ... };
class CConcrete : public IAbstract { ... };
我想做这样的事情:
IAbstract *ptr = new CConcrete();
delete ptr;
问题是,我希望 CConcrete 的“新”使用内存分配器。另外,我希望“删除”使用适当的释放器。但是,new 和 delete 是静态函数,因此上面示例中的 delete 不会调用 CConcrete 的 delete(如果 delete 是虚拟的,它应该这样做)。
解决这个问题的一种方法是做这样的事情:
class IAbstract {
public:
virtual Delete(void* ptr)=0;
void operator delete(void* ptr) {
((IAbstract*)(ptr))->Delete(ptr);
}
};
并在派生类中覆盖删除。但是这个解决方案非常难看,尤其是将 ptr 转换为 IAbstract*。
有没有更好的方法呢?