Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 链接转发链的新运营商_C++_Memory Management_Memory Leaks - Fatal编程技术网

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?