У меня есть следующий класс: Tuple
:
class Tuple {
public:
Tuple(){
}
Tuple(vector<string> newValueList){
this->values = newValueList;
}
~Tuple() {
}
private:
vector<string> values;
}
Когда я вызываю метод деструктора, я получаю утечку памяти (используя valgrind):
Invalid read of size 8
at 0x40BE66: std::vector<std::string, std::allocator<std::string> >::~vector()
by 0x40BB2D: Tuple::~Tuple()
Я не совсем понимаю, почему это происходит. Я думал, что векторы сделали свое собственное управление памятью.
Редактировать:
Вот пример того, как я создаю Tuple
:
Tuple* Tuple::duplicate(string value, int count, bool pull){
Tuple* returnTuple = 0;
vector<string> newValueList;
for (size_t i = 0; i < this->values.size(); i++) {
if (((int)i == count)&&!pull)
continue;
else{
newValueList.push_back(this->values[i]);
}
}
returnTuple = new Tuple(newValueList);
return returnTuple;
}
Tuple* Tuple::duplicate(string value, int count, bool pull)
Что такое ценность?
Вы выделяете объекты динамически
returnTuple = новый Tuple (newValueList);
Вектор инициализируется внутри объекта Tuple. Не будет утечки памяти, если вы явно удалите returnTuple где-нибудь в вашем коде. Вам нужно будет отслеживать все объекты, созданные вами динамически. Или лучше предложить пойти для shared_pointers, которые будут управлять выпуском памяти.
Также изменение Tuple * to Tuple помогло, потому что вы перешли от распределения динамических/кучи к распределению стека. Деструктор будет вызываться автоматически после того, как объекты стека выйдут из области видимости.
Хорошо, поэтому я понял решение после ваших комментариев.
У меня был vector<Tuple*>
и это вызывало утечку памяти как сумасшедший. Я просмотрел весь код и изменил каждый экземпляр Tuple*
на Tuple
и сделал другие необходимые изменения, чтобы убедиться, что мой код все еще работает. После этого у меня не было проблем с деструктором для Tuple
. Спасибо за все Ваши ответы.
Tuple
?