如果我有一个工厂,它会创建一个对象并返回一个指向它的指针,那么删除它的更好方法是什么:
通过delete
调用“用户”代码,或者通过我应该与工厂一起使用的新DestructObject
函数?
答案 0 :(得分:13)
在一般情况下,工厂可能不会使用普通旧new
来分配对象。它可以使用对象和/或页面池,malloc
与展示位置new
,或更奇特的东西(内存映射?)。至少有三种方法可以解决这个问题:
recycle
方法。delete
运算符。我毫不犹豫地推荐一个在另一个上面,因为我在最后五分钟没有给出足够的想法来提供明确的意见,但我倾向于赞成最后一个选项与常规智能指针如增强/ 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
两者:破坏
从工厂返回的对象将实现此“接口”。