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;
}
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Приводи пример кода на котором есть утечка.
А вообще разберись с методом pop.
Хотя лично я так и не понял его предназначение. По крайней мере кореляции с именем не обнаружил.
Здравствуйте, Аноним, Вы писали:
А>Вот сам класс:
[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); А>}
Точнее в этом коде ее как раз не происходит. Происходит она здесь:
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
Здравствуйте, 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.