私有操作符在c ++中删除

时间:2011-03-15 16:33:58

标签: c++ memory-management garbage-collection new-operator

我正在为我的一个项目中的一系列对象开发垃圾收集机制。我想要的是使用new动态分配这些对象,而不必调用delete

这可以通过重载operator new来调用为这些对象实现GC的专用分配器对象(当分配了太多内存时触发收集)。但是,我遇到了一个问题:用户仍然可以对这些对象执行delete,我不希望这样。

使operator delete私有是有问题的,因为C ++处理构造失败的方式 - 如果operator new是公开的,operator delete也应该是公共的。有时建议的替代方法是将operator newoperator delete都设为私有,并且只向用户公开工厂创建方法。我可以做到这一点,但感觉不太干净,需要额外的代码来编写。

<击> 编辑:另一种方法是使operator delete为空(或抛出异常)。然后,要实际释放对象,我的GC将显式调用析构函数,然后使用全局::operator delete释放内存。

还有其他想法吗?

3 个答案:

答案 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>(); 

你从不打电话给新人,你从不打电话给删除。

为什么重新发明轮子?智能指针真的是要走的路。