0

我正在为我的项目使用抽象工厂设计模式。

CPattern * CObjectA::Create(void)
{
    CPattern *p = new CPattern;
    patternList.push_back (p);
    return *p;
}

//Member variable
CPattern *pat = NULL;

pat = Obj.Create();

CObjectA 将删除析构期间分配的空间。问题是,如果客户再次这样做:

pat = Obj.Create();

我会分配另一个空间并拍拍它。如果这被调用了几百次,我将继续创建空间而不取消分配它。

在我为它分配另一个空间之前,有没有办法检查 pat 是否为空?

谢谢您的帮助!

4

2 回答 2

2
delete pat;
pat = Obj.Create();

更好的解决方案是制作pat一个智能指针,当您重新分配给新对象时,它将自动删除该对象。

保持patternList最新状态完全是另一个问题。

于 2012-09-28T01:16:01.817 回答
0

您的代码不一致:该Create函数返回一个引用,但应该返回一个指针(正如您稍后所暗示的那样pat = Obj.Create();)。(工厂自然返回指针而不是引用,因为后者鼓励意外复制到基类型的局部变量中 - 称为切片,其中不复制特定于实际运行时类型的数据成员)

“CObjectA 将删除在析构函数期间分配的空间” - 是的,但对于堆分配的对象,您必须让delete它们触发析构函数。“客户”应delete在更换之前检查和pat

delete pat;  // does nothing if pat's already NULL...
pat = new CObjectA.Create();
于 2012-09-28T01:18:14.843 回答