Closed GoogleCodeExporter closed 9 years ago
Переместил в anastasyev_daniil/task01_vector
Original comment by aivyu...@gmail.com
on 8 Mar 2013 at 7:57
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
Кстати, напоминаю, что нужно реализовать
оба контейнера: vector и list.
Original comment by aivyu...@gmail.com
on 8 Mar 2013 at 8:19
Original comment by dan.anas...@gmail.com
on 16 May 2013 at 6:59
Original comment by dan.anas...@gmail.com
on 16 May 2013 at 7:08
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
Запутался с проверкой на утечки памяти, вы
не могли бы подробнее пояснить?
Original comment by dan.anas...@gmail.com
on 18 May 2013 at 8:03
Смотрите, мы хотим понять, вдруг при
каких-то условиях Ваш класс 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
Original comment by dan.anas...@gmail.com
on 24 May 2013 at 9:10
Решение принято.
Original comment by aivyu...@gmail.com
on 26 May 2013 at 10:54
Original issue reported on code.google.com by
dan.anas...@gmail.com
on 24 Feb 2013 at 10:36