Утечка памяти при удалении объекта, который содержит вектор строк

0

У меня есть следующий класс: 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;
}
  • 1
    Как вы создаете свой объект Tuple ?
  • 1
    Один этот код не имеет ничего плохого в этом.
Показать ещё 3 комментария
Теги:
valgrind
memory-management

2 ответа

0
Tuple* Tuple::duplicate(string value, int count, bool pull)
  1. Что такое ценность?

  2. Вы выделяете объекты динамически

    returnTuple = новый Tuple (newValueList);

    Вектор инициализируется внутри объекта Tuple. Не будет утечки памяти, если вы явно удалите returnTuple где-нибудь в вашем коде. Вам нужно будет отслеживать все объекты, созданные вами динамически. Или лучше предложить пойти для shared_pointers, которые будут управлять выпуском памяти.

Также изменение Tuple * to Tuple помогло, потому что вы перешли от распределения динамических/кучи к распределению стека. Деструктор будет вызываться автоматически после того, как объекты стека выйдут из области видимости.

0

Хорошо, поэтому я понял решение после ваших комментариев.

У меня был vector<Tuple*> и это вызывало утечку памяти как сумасшедший. Я просмотрел весь код и изменил каждый экземпляр Tuple* на Tuple и сделал другие необходимые изменения, чтобы убедиться, что мой код все еще работает. После этого у меня не было проблем с деструктором для Tuple. Спасибо за все Ваши ответы.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню