如何使 c++ 修饰器模式更易于用于内存管理



在内存管理方面,是否有任何现有的技巧可以使装饰器模式更易于使用C++?

如果我在装饰器中使用 std::auto_ptr,我可以在嵌套的新样式中创建一个对象,指针将被正确删除。但是,如果我使用将指针传递到堆栈分配对象的样式,那么我们就会错误地删除这些对象。有没有办法使它正常工作或只强制执行一种风格?

#if 0
    T0 t0;
    T1 t1(&t0);
    T2 t2(&t1);
    T3 t3(&t2);
#else
    T3 t3(new T2(new T1(new T0)));
#endif

我定义了以下简单的测试类。

#include <QDebug>
#include <memory>
class TI {
public:
    virtual void test() = 0;
    virtual ~TI() {}
};
class TD : public TI {
public:
  TD(TI *ti) : _ti(ti) {}
  virtual void test() { return _ti->test(); }
private:
  std::auto_ptr<TI> _ti;
};
class T0 : public TI {
public:
    T0() { qDebug("%s", __PRETTY_FUNCTION__); }
    virtual void test() { qDebug("%s", __PRETTY_FUNCTION__); }
    virtual ~T0() { qDebug("%s", __PRETTY_FUNCTION__); }
};
class T1 : public TD {
public:
    T1(TI *ti) : TD(ti) { qDebug("%s", __PRETTY_FUNCTION__); }
    virtual void test() {  TD::test(); qDebug("%s", __PRETTY_FUNCTION__); }
    virtual ~T1() { qDebug("%s", __PRETTY_FUNCTION__); }
};
class T2 : public TD {
public:
    T2(TI *ti) : TD(ti) { qDebug("%s", __PRETTY_FUNCTION__); }
    virtual void test() {  TD::test(); qDebug("%s", __PRETTY_FUNCTION__); }
    virtual ~T2() { qDebug("%s", __PRETTY_FUNCTION__); }
};
class T3 : public TD {
public:
    T3(TI *ti) : TD(ti) { qDebug("%s", __PRETTY_FUNCTION__); }
    virtual void test() {  TD::test(); qDebug("%s", __PRETTY_FUNCTION__); }
    virtual ~T3() { qDebug("%s", __PRETTY_FUNCTION__); }
};

根据我们公司的规定,您的第一个变体是必需的 T0 t0; T1 t1(&t0); ,因为创建者(调用者)负责销毁元素,因此它已创建。在这种情况下无关紧要,wheater 实例 t0 和 t1 是在堆或堆栈上创建的。

第二个版本听起来T3 t3(new T2(new T1(new T0)));合理的,只要可以依赖某种垃圾收集(如 c# 或shared_ptr模拟)。最后,id 取决于可用的编码风格和框架。

最新更新