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

    0

    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
    Vector_type(const Vector_type& m1) {
    		if (this->size != m1.size) {
    			if (this->size != 0)
    				destroy_memmory();
    			this->size = m1.size;
    			this->M = new m_type[size];
    			for (int i = 0; i < size; i++)
    				this->M[i] = m1.M[i];
    		}
    		else {
    			for (int i = 0; i < size; i++)
    				this->M[i] = m1.M[i];
    		}
    	};
    	Vector_type& operator = (const Vector_type& m1) {
    		if (this->size != m1.size)
    			throw "not right =";
    		for (int i = 0; i < size; i++)
    			this->M[i] = m1.M[i];
    		return *this;
    	};

    Действительно что могло пойти не так? просто копировать приравнять, копировать, приравнять, копировать...

    Запостил: cat_code, 12 Октября 2018

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

    • ссори не то
      Ответить
      • Да нет, в общем-то то.

        Вот не знаю,
        Vector_type v1 = v2;

        это вызов конструктора копирования, конструктор по умолчанию + присваивание или implementation-defined?
        Ответить
        • кароч руки из жопы настолько что запостить верный (т.е. неверный) бренч даже со второго раза не смог истана(не истенного решения) здесь:
          Vector_type(const Vector_type& m1) {
          if (this->size != m1.size) {
          if (this->size != 0)
          destroy_memmory();
          this->size = m1.size;
          this->M = new m_type[size];
          for (int i = 0; i < size; i++)
          this->M[i] = m1.M[i];
          }
          else {
          for (int i = 0; i < size; i++)
          this->M[i] = m1.M[i];
          }
          };
          Vector_type& operator = (const Vector_type& m1) {
          if (this->size != m1.size)
          "not right =";
          *this = Vector_type (m1);
          return *this;
          }
          Ответить
          • Пользуйся тегами [ code][/code], %username%!
            Просто в чем смысл проверки? Типа, один раз создаем вектор нужного размера, и чтобы дальше случайно не присвоить что-то другого размера?
            Ответить
            • просто логика изначально была следующей: необходим конструктор копирования - создан конструктор копирования...

              Необходимо перегрузить оператор присваивания, так чтобы он делал то же самое что и копирования если размеры одинаковые, ну ладно просто сделаем так-наш новый вектор равен копированию... и в итоге мы имеем бесконечное присваивание)
              Ответить
        • там верное (неверное) так:
          *this = Vector_type (m1);
          Ответить
          • А, ну да. Лишняя аллокация-деаллокация.

            Стоп. Еще ж и в конструкторе использование неинициализированных полей. Которое проходит только потому, что их содержимое не совпадает с корректным size. В дебаге-то все будет работать, поскольку, как правило, память при выделении заполняется специальным значением, а вот в релизе будет рандомно падать.
            Ответить
            • даааааааааааа, в этом как раз и самое вкусное, когда не можешь понять где ты идиот, а дебаг говорит что всё ок)
              Но вечный цикл всё равно создаётся, до тех пор покуда в куче есть память.
              Ответить
              • Ой блин, рекурсия же. Самое главное я не заметил.
                Ответить
                • И я...пока мне не показалось пАдазрительным, что чёт ошибка при выделении памяти, мол её больше нет...
                  Ответить

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