Помогите найти утечку памяти в классе
От: Аноним  
Дата: 07.10.05 07:02
Оценка:
Вот сам класс:

template <class T> class CArr {
public:
T **values;
int num;

CArr ();
~CArr ();
void push (const T& element);
void pop (const int index);
void setLength (const int length);
T& operator[] (int index);
T& last ();
};

template <class T> CArr<T>::CArr ()
{
num = 0;
values = 0;
}

template <class T> CArr<T>::~CArr ()
{
for (int i = 0; i < num; i++)
delete values[i];
delete [] values;
}

template <class T> void CArr<T>::setLength (const int length)
{
T **newArr;
newArr = new T*[length];
int g = length < num ? num : length;
for (int i = 0; i < g; i++)
if (i < num && i >= length)
delete values[i];
else if (i < num)
newArr[i] = values[i];
else if (i >= num && i < length)
newArr[i] = new T;
num = length;
delete [] values;
values = newArr;
}

template <class T> void CArr<T>::push (const T& element)
{
setLength (num + 1);
last () = element;
}

template <class T> void CArr<T>::pop (int index)
{
if (num > 1)
{
delete values[index];
values[index] = new T;
*values[index] = *values[num — 1];
}
setLength (num — 1);
}

template <class T> T& CArr<T>::operator[] (int index)
{
return *values[index];
}

template <class T> T& CArr<T>::last ()
{
return *values[num — 1];
}
Re: Помогите найти утечку памяти в классе
От: Erop Россия  
Дата: 07.10.05 07:16
Оценка: +2 :)
Пользуйся std::vector!
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: Помогите найти утечку памяти в классе
От: GregZ СССР  
Дата: 07.10.05 07:17
Оценка:
Здравствуйте, Аноним, Вы писали:

Приводи пример кода на котором есть утечка.
А вообще разберись с методом pop.
Хотя лично я так и не понял его предназначение. По крайней мере кореляции с именем не обнаружил.
Re: Помогите найти утечку памяти в классе
От: crable США  
Дата: 07.10.05 07:22
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Вот сам класс:

[snip]

А где конструктор копирования и оператор присваивания?
Вобще, жуткий какой-то класс... лучше используй std::vector.
The last good thing written in C was Franz Schubert's Symphony No. 9.
Re: Помогите найти утечку памяти в классе
От: Аноним  
Дата: 07.10.05 07:38
Оценка:
Я только начинаю программировать на Си++ и по этому стараюсь не пользоваться готовыми классами, а создавать свои. Тем более классы из библиотеки STL мне кажутся немного громоздкими...
Метод pop () удаляет элемент из массива values. Утечка происходит в коде:

CArr<int> arr;
for (int i = 0; i < 9999; i++)
{
arr.push (11);
arr.pop (0);
}

Мне кажется косяк в функции setLength ()
Re[2]: Помогите найти утечку памяти в классе
От: Аноним  
Дата: 07.10.05 07:41
Оценка:
А>CArr<int> arr;
А>for (int i = 0; i < 9999; i++)
А>{
А> arr.push (11);
А> arr.pop (0);
А>}

Точнее в этом коде ее как раз не происходит. Происходит она здесь:

CArr<int> arr;

for (int i = 0; i < 9999; i++)
arr.push (11);

for (int i = 0; i < 9999; i++)
arr.pop (0);
Re[3]: Помогите найти утечку памяти в классе
От: Radmir Россия  
Дата: 07.10.05 08:13
Оценка:
Здравствуйте, <Аноним>, Вы писали:


Приведенный тобою код компилируется и утечки нет.

Но позволь сделать несколько замечаний:

1. классы STL не очень то и громозкие, но зато эффетивны.

2. С ними работать намного прощее.

3. Твой код крайне неэффективный. Напимер вот это:

template <class T> void CArr<T>::setLength (const int length)
{
    T **newArr;
    newArr = new T*[length];
    int g = length < num ? num : length;
    for (int i = 0; i < g; i++)
        if (i < num && i >= length)
            delete values[i];
        else if (i < num)
            newArr[i] = values[i];
        else if (i >= num && i < length)
            newArr[i] = new T;
        num = length;
        delete [] values;
        values = newArr;
}


3.1. При каждом изменении размера происходит выделении нового блока памяти. Что во первых в 2 раза увеличивает объем памати необходимый твоему классу. Во- вторых безосновательно тратит процессорное время.

3.2. ты копируешь элементы по одному далеко не самый эффективный сособ. на крайний случай лучше использовать memcpy
3.3. для доступа к элементам массива используешь оператор [] который подразумевает операцию унтожения, лучше использовать указатели и инкрементировать их.

В связи с выше указанным, твой класс крайне неэффективно использует память и процессорное время. Не проще ли перейти все таки на STL
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Лучше спросить дорогу чем заблудиться
Re[4]: Помогите найти утечку памяти в классе
От: srggal Украина  
Дата: 07.10.05 08:17
Оценка:
Здравствуйте, Radmir, Вы писали:

R>Здравствуйте, <Аноним>, Вы писали:




R>3.2. ты копируешь элементы по одному далеко не самый эффективный сособ. на крайний случай лучше использовать memcpy


memcpy лучше не использовать в обобщенных контиейнерах, использование которых не ограничено POD.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[4]: Помогите найти утечку памяти в классе
От: crable США  
Дата: 07.10.05 08:19
Оценка:
Здравствуйте, Radmir, Вы писали:

R>Здравствуйте, <Аноним>, Вы писали:



R>Приведенный тобою код компилируется и утечки нет.

[snip]
В приведенном коде утечки нет, но может быть если в массиве будут хранится пользовательские классы, потому что о безопасности в случае исключений автор явно не слышал...

template <class T> void CArr<T>::setLength (const int length)
{
T **newArr;
newArr = new T*[length];
int g = length < num ? num : length;
for (int i = 0; i < g; i++)
if (i < num && i >= length)
delete values[i];
else if (i < num)
newArr[i] = values[i];
else if (i >= num && i < length)
newArr[i] = new T; // если конструтор T кидает исключение, newArr теряется...
num = length;
delete [] values;
values = newArr;
}
The last good thing written in C was Franz Schubert's Symphony No. 9.
Re[5]: Помогите найти утечку памяти в классе
От: Radmir Россия  
Дата: 07.10.05 08:47
Оценка:
Здравствуйте, srggal, Вы писали:

S>memcpy лучше не использовать в обобщенных контиейнерах, использование которых не ограничено POD.


Я же написал на крайний случай
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Лучше спросить дорогу чем заблудиться
Re[6]: Помогите найти утечку памяти в классе
От: srggal Украина  
Дата: 07.10.05 08:57
Оценка:
Здравствуйте, Radmir, Вы писали:

R>Здравствуйте, srggal, Вы писали:


R>Я же написал на крайний случай


Поэтому я и не поставил "-1", но человек новичок, как он написал, для него имеет смысл раскрывать что-такое "крайний случай".
... << RSDN@Home 1.1.4 stable rev. 510>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.