c++ - 如何使 C++ 装饰器模式更易于用于内存管理?

标签 c++ decorator

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

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

#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 取决于可用的编码风格和框架。

关于c++ - 如何使 C++ 装饰器模式更易于用于内存管理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21055571/

相关文章:

javascript - 如何忽略 TypeScript 装饰器(像通常类型一样使用 NestJS 实体)?

c++ - seekg() 神秘地失败

c++ - 将包含多个数字的字符串转换为整数

c++ - 使用 boost 的 LU 求解器但避免计算逆矩阵?

python - 成员函数装饰器和 self 参数

java - 使用装饰器模式装饰 JLabel

c++ - decltype 声明函数返回类型的参数(无自动)

c++ - 错误 : 'strstr' was not declared in this scope

python - 在另一个装饰器之前使用 PyQt 4's ' pyqtSlot' 装饰器的奇怪行为

python - python中的函数装饰器是什么