C++ 链接转发链的新运营商
考虑下面的类C++ 链接转发链的新运营商,c++,memory-management,memory-leaks,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 de
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(新的第一个,新的转发器(新的somether,新的转发器(新的yougetheidea,NULL))代码>
这是构建链的一种非常方便的方法,但是它很危险,并且容易发生内存泄漏,因为编译器可以随意地处理事情。是否有一种更安全的方法来构建我想要的链(最好保留精益语法) 不要显式使用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();
}
};
例如,
类转发器:公共基础
{
私人:
共享目的地;
共享下一步;
公众:
显式转发器(共享\u ptr dest,共享\u ptr 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))));
转发器f(make_shared()、make_shared(make_shared()、make_shared(make_shared()、shared_ptr(NULL)));
如果实现make_unique()
(或等效的工厂方法),您也可以使用unique\u ptr
来代替它,因为编译器可以随意移动,这是什么意思?@KevinBallard无法保证它分配内存的顺序。例如,如果SomeOther
抛出First
而未传递给构造函数并被泄漏,则它可以先分配,然后再分配SomeOther
。也许您应该将这些参数改为std::unique_ptr
或std::shared_ptr
s?