删除工厂创建的对象的位置?

时间:2010-07-11 07:02:53

标签: c++ design-patterns factory

如果我有一个工厂,它会创建一个对象并返回一个指向它的指针,那么删除它的更好方法是什么:

通过delete调用“用户”代码,或者通过我应该与工厂一起使用的新DestructObject函数?

4 个答案:

答案 0 :(得分:13)

在一般情况下,工厂可能不会使用普通旧new来分配对象。它可以使用对象和/或页面池,malloc与展示位置new,或更奇特的东西(内存映射?)。至少有三种方法可以解决这个问题:

  1. 让对象在完成对象后提供recycle方法。
  2. 返回一个智能指针,该指针知道如果没有任何引用者,该知道如何取消该对象。
  3. 在对象本身中实现自定义delete运算符。
  4. 我毫不犹豫地推荐一个在另一个上面,因为我在最后五分钟没有给出足够的想法来提供明确的意见,但我倾向于赞成最后一个选项与常规智能指针如增强/ TR1 :: shared_ptr的。

答案 1 :(得分:1)

手动删除它的最佳方式是not at all

答案 2 :(得分:1)

以下代码提供了一个不考虑谁应该删除新创建的对象的机会。

class FooFactory
{
public:
    static std::auto_ptr<Foo> CreateInstance();
};

// transmit ownership of created object from factory to 'a' variable
std::auto_ptr<Foo> a = FooFactory::CreateInstance();
// using the created object is not required
FooFactory::CreateInstance();

答案 3 :(得分:0)

针对此问题的最通用的解决方案是从具有虚拟“查杀”功能的基类派生您的类。像这样:

class IDisposable {
public:
    virtual void Release() = 0;
};

通常认为多态对象应该具有虚拟析构函数以支持正确的对象清理。然而,这是不完整的,因为它没有考虑到对象的可能不同的内存管理。

另一方面,此方法不需要使用虚拟析构函数。它现在由Release函数替换,它同时执行两个操作:调用正确的析构函数并通过适当的方式释放内存。

负责对象destr

两者:破坏

从工厂返回的对象将实现此“接口”。

相关问题