gpt4 book ai didi

c++ - C++ 中的私有(private)运算符删除

转载 作者:可可西里 更新时间:2023-11-01 16:46:48 24 4
gpt4 key购买 nike

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

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

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

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

还有其他想法吗?

最佳答案

我个人认为私有(private)化和使用工厂的想法是更清洁的方法。使用 new 而不是 delete(或分配给智能指针)会使很多代码维护者感到困惑。

如果您可以指示指针来自 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;
}
};

关于c++ - C++ 中的私有(private)运算符删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5314846/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com