divyang4481 / mipt-hw

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

task01 вектор ражева #193

Closed GoogleCodeExporter closed 9 years ago

GoogleCodeExporter commented 9 years ago
/rajeva_maria/Task01/

Original issue reported on code.google.com by RMarie...@gmail.com on 29 Mar 2013 at 12:29

GoogleCodeExporter commented 9 years ago
Я переименовал папку с Вашим заданием. Так 
что, перед тем, как что-либо дальше локально 
делать, прошу вызвать svn update.

Original comment by aivyu...@gmail.com on 6 Apr 2013 at 9:03

GoogleCodeExporter commented 9 years ago
0. Программа не собирается:
Vector.cpp: In member function ‘void TVector<T>::insert(T*, T&)’:
Vector.cpp:100: error: expected `;' before ‘i’
Vector.cpp:100: error: ‘i’ was not declared in this scope
Vector.cpp: In member function ‘void TVector<T>::resize() [with T = int]’:
Vector.cpp:54:   instantiated from ‘void TVector<T>::pushback(T) [with T = 
int]’
Vector.cpp:118:   instantiated from here
Vector.cpp:64: warning: comparison between signed and unsigned integer 
expressions

1. Не вижу тестов. В том числе, не вижу тестов 
на утечки памяти.

2. Вы именуете методы то с большой буквы, то 
с маленькой. Придерживайтесь единого стиля 
кода в пределах файла.

3. Методы Size(), empty(), Capacity(), begin(), end() 
невозможно вызвать у константного вектора.

4. Не реализованы конструктор копирования и 
оператор копирующего присваивания. При 
этом они не скрыты в private, значит компилятор 
генерирует их по умолчанию. Их поведение по 
умолчанию осуществляет неглубокое 
копирования, что приведет к утечке памяти.

  4.1: Вопрос: объясните, чем отличается глубокое копирование от неглубокого.

  4.2: Вопрос: почему описанная в пункте 4 проблема приводит к утечке памяти? Приведите пример кода с утечкой.

5. resize должен принимать желаемый размер 
вектора
reserve - желаемый размер внутреннего буфера (у 
Вас он вообще принимает T&, что нелогично)
Напоминаю, что согласно заданию нужно 
реализовать поведение классов как у 
соответствующих контейнеров STL. 
Внимательно читайте документацию:
http://cplusplus.com/reference/vector/vector/resize/?kw=vector%3A%3Aresize
http://cplusplus.com/reference/vector/vector/reserve/?kw=vector%3A%3Areserve

6. В swap какой-то бред. Вы вообще проверяли, 
что он работает? Что должно быть:
http://cplusplus.com/reference/vector/vector/swap/?kw=vector%3A%3Aswap

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

Original comment by aivyu...@gmail.com on 6 Apr 2013 at 9:13

GoogleCodeExporter commented 9 years ago
ответ на 4 вопрос. при неглубоком 
копировании перенаправляются указатели, 
поэтому не освобождается память, 
содержащая данные, на которые ранее 
указывал указатель.
какой пример?? если любой, то читайте мои 
программы прошлого семестра:) 
типа вот:
int main(){
int* A=new int[7];
for (int i = 0; i<7; ++i)
A[i] = i;
return 0;
}

Original comment by RMarie...@gmail.com on 21 May 2013 at 12:36

GoogleCodeExporter commented 9 years ago

Original comment by RMarie...@gmail.com on 21 May 2013 at 12:36

GoogleCodeExporter commented 9 years ago
Про глубокое/неглубокое копирование 
непонятно. Что значит "перенаправляются" 
указатели.
Что значит глубокое копирование?

Я Вас прошу объяснить не просто, что такое 
утечка. Это итак понятно: не позвали delete. 
Вопрос в другом: ПОЧЕМУ неглубокое 
копирование может привести к утечки. Нужно 
привести КОНКРЕТНЫЙ ПРИМЕР КОДА, в котором 
это продемонстрировано.

Original comment by aivyu...@gmail.com on 21 May 2013 at 12:42

GoogleCodeExporter commented 9 years ago
Перенаправляются указатели - это значит, 
копируется адрес, а не сами данные. 
Глубокое копирование - копируются сами 
данные (значения полей класса).
int main()
{
   TVector<int>A;
   //заполнение массива A;
   TVector<int>B(A);
  return 0;
 } 
   тогда выполнится A.buf=B.buf.
   так как это указатели, то получится, что на B ничего не указывает, а память       выделена. 

Original comment by RMarie...@gmail.com on 21 May 2013 at 2:37

GoogleCodeExporter commented 9 years ago
ok. Ответ принимается.

Код позже посмотрю.

Original comment by aivyu...@gmail.com on 21 May 2013 at 2:38

GoogleCodeExporter commented 9 years ago
1. Методы front/back возможно вызвать только у 
конст объекта

2. Невозможно создать копию вектора от 
констатного объекта:
const TVector<int> a;
...
TVector<int> b(a);

3. Пишу в main() код:
        {
            TVector<TFoo> a;
            for (int i = 0; i < 10; ++i)
                a.Pushback(TFoo());

            TVector<TFoo> b = a;
            for (int i = 0; i < 10; ++i)
                b.Pushback(TFoo());

            a.Swap(b);

            TVector<TFoo> c;
            a = c;
        }
Пробую скомпилировать, получаю:
Vector.cpp: In member function ‘TVector<T>& 
TVector<T>::operator=(TVector<T>&) [with T = TFoo]’:
Vector.cpp:228:   instantiated from here
Vector.cpp:149: error: ‘cop->TVector<TFoo>::size’ cannot be used as a 
function
Vector.cpp:150: error: ‘push_back’ was not declared in this scope

Я закоммитил этот код, так что, не забудьте 
сделать svn update, прежде чем менять файл.

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

Original comment by aivyu...@gmail.com on 26 May 2013 at 11:43

GoogleCodeExporter commented 9 years ago

Original comment by RMarie...@gmail.com on 26 May 2013 at 3:31

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

Оценка: 0.4 балла

Original comment by aivyu...@gmail.com on 26 May 2013 at 7:23