链接转发链的新运营商

时间:2013-02-03 23:23:44

标签: c++ memory-management memory-leaks

考虑以下课程

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)));

这是构建链的一种非常方便的方法,但是它很危险并且容易受到内存泄漏的影响,因为编译器可以随意乱转。是否有更安全的方式来构建我想要的链(最好保留精益语法)?

1 个答案:

答案 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()