Возможный дубликат:
Как правильно освободить или удалить вектор c++?
У меня возникли проблемы с удалением памяти, выделенной в векторе. Несмотря на то, что я вызываю list.clear(), это не освобождает память.
Итак, у меня есть такой код в классе на основе шаблона с именем Set
template <class T>
class Set {
public:
// stuff
private:
int size;
std::vector<T> list;
};
А в конструкторе я выделил память под вектор. Итак, я вызываю list = new std::vector;
Для вашего интереса, вот мой конструктор копирования и оператор присваивания, которые я также написал, где я также выделяю память для вектора:
template <class T>
Set<T>::Set(const Set& aSet)
{
size = aSet.size;
list->clear();
list = new vector<T>;
for (int i = 0; i < size; ++i) {
list[i] = aSet.list[i];
}
}
template <class T>
Set<T>& Set<T>::operator=(const Set& right)
{
if (this != &right) {
list->clear();
size = right.size;
list = new vector<T>;
for (int i = 0; i < size; ++i) {
list[i] = right.list[i];
}
}
return (*this);
}
В деструкторе у меня просто есть list.clear(), чтобы удалить все элементы, а затем освободить память.
Но проблема в том, что когда я запускаю valgrind в моем файле .out, он говорит мне, что я определенно потерял часть памяти, и я не знаю, почему он мне это говорит. Я прочитал несколько вопросов здесь, в Stackoverflow, но в основном перепробовал все. Я попробовал очистить(), а затем удалить вектор, но это не сработало. Затем я попытался стереть (list.begin(), list.end()), но это тоже не сработало.
Мой мыслительный процесс заключается в том, что я использую Set *aSet = new Set; в моем основном классе, и поскольку int не является объектом, он не освобождается, когда я вызываю list.clear(). Это правильно? Как мне правильно стереть память?
Спасибо за любую помощь.
Edit1 = изменен список* на setList
Мои новые конструкторы и оператор присваивания:
template <class T>
Set<T>::Set(const Set& aSet)
{
size = aSet.size;
setList.clear();
setList = aSet.setList;
}
template <class T>
Set<T>& Set<T>::operator=(const Set& right)
{
if (this != &right) {
setList.clear();
size = right.size;
setList = right.setList;
}
return (*this);
}
Valgrind по-прежнему сообщает, что у меня такое же количество потерянной памяти. В моем деструкторе у меня все еще есть list.clear()
Журнал Валгринд:
==11398==
==11398== HEAP SUMMARY:
==11398== in use at exit: 62,969 bytes in 352 blocks
==11398== total heap usage: 540 allocs, 188 frees, 68,046 bytes allocated
==11398==
==11398== LEAK SUMMARY:
==11398== definitely lost: 8,624 bytes in 14 blocks
==11398== indirectly lost: 1,168 bytes in 5 blocks
==11398== possibly lost: 4,829 bytes in 56 blocks
==11398== still reachable: 48,348 bytes in 277 blocks
==11398== suppressed: 0 bytes in 0 blocks
==11398== Rerun with --leak-check=full to see details of leaked memory
new
. Вы просто объявляетеlist
вектором,std::vector<T> list;
и затем не инициализируете его ничем в конструкторе; Он автоматически инициализируется с помощью конструктора вектора по умолчанию. 07.11.2012