在内存管理方面,是否有任何现有的技巧可以使装饰器模式更易于使用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 取决于可用的编码风格和框架。