我正在尝试优化项目的部分代码。有一些上下文可以显示:
Class Basic
{
type* _shareResource;
virtual Basic(){};
virtual ~Basic(){};
virtual void initialResource() = 0;
virtual void deleteResource() = 0;
virtual void ownmethod() = 0;
static Basic* createChild(int condition);
}
Basic* Basic::createChild(int condtion)
{
Basic* pointer;
if (condition == 1)
pointer = new ChildA();
else
pointer = new ChildB();
return pointer;
}
Class ChildA::public Basic
{
void initialResource(){ allocate memory for _shareResource;}
void deleteResource(){ delete _shareResource; _shareResource = NULL;}
ChildA(){ initialResource(); }
~ChildA(){ deleteResource(); }
virtual ownmethod() {// child A method}
}
Class ChildB::public ChildA
{
void initialResource(){ allocate memory for _shareResource;}
void deleteResource(){ delete _shareResource; _shareResource = NULL;}
ChildB(){ initialResource(); }
~ChildB(){ deleteResource(); }
virtual ownmethod(){// child B method}
}
所以,当我使用 Basic::createChild() 作为客户端时: Basic* aPointer = CreateChild(1); //使用一段时间后,客户端应该删除这个指针 delete aPointer;
然而,RALL 需要基本删除本身,无需客户的帮助。所以我正在尝试修改代码。我所做的是:
boost::share_ptr<Basic> Basic::createChild(int condtion)
{
boost::share_ptr<Basic> pointer;
if (condition == 1)
pointer = boost::share_ptr<ChildA>(new ChildA());
else
pointer = boost::share_ptr<ChildA>(new ChildB());
return pointer
}
但是我得到核心转储作为内存泄漏,我从子类的 deleteResource() 中检查了它,但我不知道为什么。
您能帮我解释一下核心转储或为遵循 RALL 原则提供更好的解决方案吗?非常感谢。(我更喜欢将 createChild 保留为静态方法,因为我的优化不应该修改太多的客户端代码)