divyang4481 / mipt-hw

Automatically exported from code.google.com/p/mipt-hw
0 stars 0 forks source link

task01 Реализация STL-контейнера (Анастасьев) #179

Closed GoogleCodeExporter closed 9 years ago

GoogleCodeExporter commented 9 years ago
anastasyev_daniil/T2_task1.1_TVector/

Можно, только vector для начала?

Original issue reported on code.google.com by dan.anas...@gmail.com on 24 Feb 2013 at 10:36

GoogleCodeExporter commented 9 years ago
Переместил в anastasyev_daniil/task01_vector

Original comment by aivyu...@gmail.com on 8 Mar 2013 at 7:57

GoogleCodeExporter commented 9 years ago
0. Варнинги:
./main.cpp: In member function ‘T& TVector<T>::operator[](size_t) [with T = 
int]’:
./main.cpp:133: warning: control reaches end of non-void function

1. Зачем 2 версии методов Size, Capacity?

2. Empty должен быть константным?

3. Явный вызов деструктора - опасно.

4. Фишка метода Swap в том, что он должен 
работать за O(1).
У Вас он работает за O(n). В таком случае он 
просто не имеет смысла, т.к. можно 
воспользоваться стандартной функцией swap.

5. Использование memcpy - грубая ошибка, т.к. эта 
функция копирует просто память. Объекта, 
хранимые в векторе, могут иметь сложное 
устройство. Например, они могут иметь 
внутри себя ссылки на динамически 
выделенную память. Правильно - поэлементно 
копировать с использованием оператора 
operator=.

6. Не обязательно называть методы begin и cbegin. 
Можно дать им одинаковое название. При этом 
сигнатура у них будет разная, т.к. в С++ 
константность метода входит в сигнатуру. 
Следовательно ошибки нет. Переделайте, 
пожалуйста, согласно требованиям задания.

7. Не вижу тестов на утечки памяти.

Original comment by aivyu...@gmail.com on 8 Mar 2013 at 8:06

GoogleCodeExporter commented 9 years ago
Кстати, напоминаю, что нужно реализовать 
оба контейнера: vector и list.

Original comment by aivyu...@gmail.com on 8 Mar 2013 at 8:19

GoogleCodeExporter commented 9 years ago

Original comment by dan.anas...@gmail.com on 16 May 2013 at 6:59

GoogleCodeExporter commented 9 years ago

Original comment by dan.anas...@gmail.com on 16 May 2013 at 7:08

GoogleCodeExporter commented 9 years ago
0. Warnings:
main.cpp: In member function ‘void TVector<T>::Reserve(size_t) [with T = 
int]’:
main.cpp:198:   instantiated from here
main.cpp:81: warning: comparison between signed and unsigned integer expressions
main.cpp: In member function ‘T& TVector<T>::operator[](size_t) [with T = 
int]’:
main.cpp:144: warning: control reaches end of non-void function
main.cpp: In member function ‘const T& TVector<T>::operator[](size_t) const 
[with T = int]’:
main.cpp:149: warning: control reaches end of non-void function

Причем эти предупреждения указывают на 
довольно грубые ошибки.

1. Не вижу проверки на утечки памяти. Вы 
добавили поля Created/Deleted в TVector. Это не имеет 
никакого смысла.
Мы ведь хотим проверить не то, как кто-то 
забыл удалить TVector, а что сам класс TVector 
корректно работает с памятью: не удаляет 
дважды и память не течет.
Для этого предлагает описать специальный 
тип. Экземпляры этого типа хранить в TVector. С 
помощью статических полей подсчитывать 
кол-во созданных и удаленных объектов.

2. Ваш метод swap до сих пор работает за O(n).
Если что-то непонятно, пишити, спрашивайте, 
а не просто игнорируйте мое замечание.

Решение не принято.

Original comment by aivyu...@gmail.com on 17 May 2013 at 12:01

GoogleCodeExporter commented 9 years ago
Запутался с проверкой на утечки памяти, вы 
не могли бы подробнее пояснить?

Original comment by dan.anas...@gmail.com on 18 May 2013 at 8:03

GoogleCodeExporter commented 9 years ago
Смотрите, мы хотим понять, вдруг при 
каких-то условиях Ваш класс TVector память под 
элементы выделяет, но потом не освобождает. 
Т.е. ищем утечки памяти.

Вообще, для этого есть специальный софт: 
PurifyPlus, Valgrind, VTune, etc.

Но предлагается следующее примитивное 
решение. Заводим вспомогательную 
структурку:
struct TFoo {
  static int Created;
  static int Deleted;

  TFoo() { ++Created; }
  TFoo(const TFoo&) { ++Created; }
  ~TFoo() { ++Deleted; }
};

int TFoo::Created = 0;
int TFoo::Deleted = 0;

В статических полях Created/Deleted мы храним 
сколько раз мы создавали/удаляли объекты 
класса TFoo.

Далее в main мы создаем TVector<TFoo> и пытаемся по 
всякому его использовать.
По окончании работы выводим на консоль 
значения переменных Created/Deleted. Если они не 
совпадают, значит есть утечки.

Original comment by aivyu...@gmail.com on 19 May 2013 at 9:51

GoogleCodeExporter commented 9 years ago

Original comment by dan.anas...@gmail.com on 24 May 2013 at 9:10

GoogleCodeExporter commented 9 years ago
Решение принято.

Original comment by aivyu...@gmail.com on 26 May 2013 at 10:54