1. C++ / Говнокод #12835

    +11

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    template <class T>
    class autoptr
    {
      private:
        T * _ptr;
    
      public:
        autoptr()
        {
            _ptr = 0;
        }
    
        autoptr( T * ptr )
        {
            _ptr = ptr;
        }
    
        ~autoptr()
        {
            if(_ptr) delete _ptr;
        }
    
        operator T * ()
        {
            return _ptr;
        }
    
        T * operator -> ()
        {
            return _ptr;
        }
        T * get()
        {
            T *ret = _ptr;
            _ptr = 0;
            return ret;
        }
    };
    
    template <class T>
    class autoptr_mas
    {
    // ...

    НУ ЗАЧЕМ?!

    Запостил: roman-kashitsyn, 01 Апреля 2013

    Комментарии (25) RSS

    • очередной гейний велосипедист написал очередное говно
      по всему видно считал себя умней всех
      Верный призрак:
      autoptr(){...}
      autoptr( T * ptr ){...}
      Ответить
      • Кстати он еще и бажный, т.к. не перегружены (или не заныканы в приват) оператор присваивания и конструктор копий...

        > if(_ptr) delete _ptr;
        Тоже бессмысленно и беспощадно.
        Ответить
        • Почему? Это же lazy destructor удаляет только тогда, когда надо удалить. :)
          Ответить
          • Так в delete и так есть эта проверка...
            Ответить
            • Семь раз отмерь один раз отрежь же!
              В идеале должно быть так:
              ~autoptr()
                  {
                      if(_ptr) 
                         if(_ptr) 
                            if(_ptr) 
                               if(_ptr) 
                                  if(_ptr) 
                                     if(_ptr) 
                                       delete _ptr; //седьмая проверка в delete
                  }
              Ответить
    • > НУ ЗАЧЕМ?!
      так ведь std::auto_ptr должен быть задепрекачен, буста нет, c++11 нет, а кому охота пользоваться задепрекаченными в будущем классами? свой то вот он, никто не посмеет, всегда будет актуален!
      Ответить
      • Хоть он и бажный, зато баги свои, родные, и никуда не денутся.
        Ответить
    • Q: Как поместить в этот автоптр другой указатель?
      A: Вот так:
      autoptr<test> t(...);
      t.~autoptr(); // удаляем старый объект
      new (&t) autoptr<test>(...); // помещаем новый
      Ответить
      • Ты не проникся.
        t(...);
        t.get();
        t=autoptr<test> (...);
        Ответить
        • > t=autoptr<test> (...);
          бдыщ
          Ответить
          • Ну ладно, уговорил. Ахретектура распоЛАГАЕТ
            autoptr<test> t(new test);
               t.get();
               autoptr<test> tmp(new test);
               t=tmp;
               tmp.get();
            Ответить
            • Почему результат, возвернутый get'ом не удаляешь? Утечка памяти же.
              autoptr<test> t(new test);
              delete t.get();
              autoptr<test> tmp(new test);
              t=tmp;
              Ответить
              • ага... вообщем сделать как ты первый раз предложил проще
                Ответить
    • клёвая семантика по get() ко всему прочему
      Ответить
    • Глупый указатель.
      Ответить
    • Я C++ не знаю, подскажите, пожалуйста. Код в 10-й и 35-й строках как будет воспринят? Будет присвоен ноль соответствующего типа, или же всё тупо рухнет если <T> - не численный? И скомпилируется вообще?
      Ответить
      • будет присвоен 0 соответствующего типа - "указатель на Т"
        считай, что там стоит nullptr/NULL, если так будет понятней
        Ответить
    • class autoptr_mas
      {
      // ...
      Можете назвать меня извращенцем, но я хочу видеть продолжение этого!
      Ответить
      • Спешиал фор ю
        template <class T>
        class autoptr_mas
        {
          private:
            T * _ptr;
        
          public:
            autoptr_mas()
            {
                _ptr = 0;
            }
        
            autoptr_mas( T * ptr )
            {
                _ptr = ptr;
            }
        
            ~autoptr_mas()
            {
                if(_ptr) delete[] _ptr;
            }
        
            operator T * ()
            {
                return _ptr;
            }
        
            T * operator -> ()
            {
                return _ptr;
            }
        
            autoptr_mas & operator = (T * ptr)
            {
                if(_ptr == ptr)
                    return *this;
                if(_ptr)
                    delete [] _ptr;
        
                _ptr = ptr;
                return *this;
            }
        };
        Ответить
    • - Так вот что я Вам скажу! Вы ничего не понимаете! Я не знаю, как там у вас в БДСМ. Но, похоже, там всё неправильно у вас!
      Ответить

    Добавить комментарий