我正在为我的项目使用抽象工厂设计模式。
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是否为空?
感谢您的帮助!
答案 0 :(得分:2)
delete pat;
pat = Obj.Create();
更好的解决方案是使pat
成为智能指针,当您重新分配给新对象时,它会自动删除该对象。
保持patternList
最新是另一个问题。
答案 1 :(得分:0)
您的代码不一致:Create
函数返回一个引用,但应该返回一个指针(如后面的pat = Obj.Create();
所暗示的那样)。 (工厂自然会返回指针而不是引用,因为后者鼓励意外复制到基类型的局部变量 - 称为切片,其中不复制特定于实际运行时类型的数据成员)
“CObjectA将删除在析构函数期间分配的空间” - 是的,但对于堆分配的对象,您必须delete
它们才能触发析构函数。在替换delete
之前,“客户”应检查并pat
:
delete pat; // does nothing if pat's already NULL...
pat = new CObjectA.Create();