Selfdestruct object и this == NULL
От: Мишень-сан  
Дата: 30.10.09 09:51
Оценка:
Доброго времени суток!

Возник вопрос по применению двух мини-паттернов.

1. Паттерн "самоубийца". Объект создаётся исключительно в куче с помощью фабричного метода, управление временем жизни — через addref/release, причём release при достижении 0 в счётчике ссылок делает delete this.
2. Использование в нестатических невиртуальных методах проверки на this == NULL с возвратом некого значения по умолчанию.
Пример:
  template<class TValue>
  struct node
  {
    typedef TValue value_type;
    /// create new node
    static const node* create(const value_type& value, const node* next = 0)
    {
      return new node(value, next ? next->addref() : 0);
    }
    /// increases reference counter
    const node* addref() const
    {
      if (!this)
        return 0;
      ++_refcount;
      return this;
    }
    /// decreases reference counter and frees node if necessary
    void release() const
    {
      if (!this)
        return;
      --_refcount;
      if (!_refcount)
        delete this;  /// no other node referencers, can be deleted
    }
  
    const node* tail() const
    {
      if (!this)
        return 0;
      return _next;
    }
  
    const value_type& value() const
    {
      if (!this)
        throw std::logic_error("Cannot access structure via null pointer");
      return _value;
    }
  
    size_t length() const
    {
      if (!this)
        return 0;
      return 1 + _tail->length();
    }
  
  private:
    value_type      _value;     /// node's value
    const node*     _next;      /// next node in chain
    mutable size_t  _refcount;  /// quantity of node referencers
  
    node(const value_type& value, const node* next)
      : _value(value), _next(next)
    { }
 
    ~node()
    {
      _next->release();
    }
  };


Насколько допустимо применять подобные приёмы? Особенно (this == 0)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.