考虑以下课程
class Forwarder : public Base
{
private:
Base* dest;
Forwarder* next;
public:
explicit Forwarder(Base* dest, Forwarder* next)
: dest(dest), next(next) {}
~Forwarder() {
if (next) delete next;
delete dest;
}
void DoStuff() {
if (next) next->DoStuff();
dest->Process();
}
};
其目的是为事件创建转发链,因此如果在基础上调用DoStuff
,它将在整个链中传播,通知其他人。我想用它来将输出发送到各种流。无论如何,创建链的典型方法是:
Forwarder f(new First, new Forwarder(new SomeOther, new Forwarder(new YouGetTheIdea, NULL)));
这是构建链的一种非常方便的方法,但是它很危险并且容易受到内存泄漏的影响,因为编译器可以随意乱转。是否有更安全的方式来构建我想要的链(最好保留精益语法)?
答案 0 :(得分:1)
不使用显式使用new
,而是使用一个返回智能指针的函数,并使构造函数接收智能指针。
For example,
class Forwarder : public Base
{
private:
shared_ptr<Base> dest;
shared_ptr<Forwarder> next;
public:
explicit Forwarder(shared_ptr<Base> dest, shared_ptr<Forwarder> next)
: dest(dest), next(next) {}
void DoStuff() {
if (next) next->DoStuff();
dest->Process();
}
};
然后使用它:
Forwarder f(make_shared<First>(), make_shared<Forwarder>(make_shared<SomeOther>(), make_shared<Forwarder>(make_shared<YouGetTheIdea>(), shared_ptr<Forwarder>(NULL))));
如果您实施unique_ptr
(或等效的工厂方法),您也可以使用make_unique()