我正在为我的一个项目中的一系列对象开发垃圾收集机制。我想要的是使用new
动态分配这些对象,而不必调用delete
。
这可以通过重载operator new
来调用为这些对象实现GC的专用分配器对象(当分配了太多内存时触发收集)。但是,我遇到了一个问题:用户仍然可以对这些对象执行delete
,我不希望这样。
使operator delete
私有是有问题的,因为C ++处理构造失败的方式 - 如果operator new
是公开的,operator delete
也应该是公共的。有时建议的替代方法是将operator new
和operator delete
都设为私有,并且只向用户公开工厂创建方法。我可以做到这一点,但感觉不太干净,需要额外的代码来编写。
<击>
编辑:另一种方法是使operator delete
为空(或抛出异常)。然后,要实际释放对象,我的GC将显式调用析构函数,然后使用全局::operator delete
释放内存。
击>
还有其他想法吗?
答案 0 :(得分:2)
我个人认为让私人和使用工厂的想法是更清洁的方法。使用new但不删除(或分配给智能指针)会使代码中的许多维护者感到困惑。
如果您可以指示指针来自GC收集的工厂(或由GC收集的工厂拥有),那么它将使代码更难以维护。通过使用工厂,您明确声明GC工厂是所有者,因此应该保持对象的生命周期:
class GCFactory
{
public:
template<T, P1>
T& createGCObject(P1 const& p1) // Or return by pointer.
{
T* result = new T(p1);
// Do stuff to register with garbage collector.
// Then return object (I like reference) but I have not studied the
// problem that hard so may be in-appropriate.
return * result;
}
template<T, P1, P2>
T& createGCObject(P1 const& p1, P2 const& p2)
{
T* result = new T(p1, p2);
// Do stuff to register with garbage collector.
return * result;
}
template<T, P1, P2, P3>
T& createGCObject(P1 const& p1, P2 const& p2, P3 const& p3)
{
T* result = new T(p1, p2, p3);
// Do stuff to register with garbage collector.
return * result;
}
};
答案 1 :(得分:1)
重载删除为无操作。 (需要更多字符)
答案 2 :(得分:-1)
boost::shared_ptr<Type> ptr = boost::make_shared<Type>();
你从不打电话给新人,你从不打电话给删除。
为什么重新发明轮子?智能指针真的是要走的路。