Задать вопрос
@communistic_sistema
Биохимик, но в программировании немного шарю

Где утечка памяти?

Есть цикл кода, в котором вызывается 1 функция с 2 разными аргументами - 15 с true и 5 с true.
Результат дебага - ступенчатый рост памяти процесса (ну это ожидаемо с векторами). Но память для векторов для указателей превышает 10Мб, когда указателей в векторе 5-15.
int typeallocator::setlistsize(size_t listsize, bool forced) {
	if (listsize < iters.size()) {
		if (forced) {
			for (size_t i = iters.size(); i > listsize; i--) {
				iters.back()->~iterator();
				iters.pop_back();
			}
			return 0;
		}
		return -1;
	}
	for (size_t i = iters.size(); i < listsize; i++) {
		iters.push_back(new iterator(typesize));
	}
	return 0;
}

вот деструктор итератора
iterator::~iterator() {
	for (stream::stream* s : usedbystreams) {
		s->killstream(0);
	}
	free(pointer);
	usedbystreams.clear();
}

вот структура итератора
struct iterator {
	iterator(size_t typesize);
	~iterator();
	uint64_t id = 0;
	uint64_t type = 0;
	bool isblocked = false;
	void* pointer;
	vector<stream::stream*> usedbystreams;
};

я пробовал как clear так и ~vector, чтобы каждый удаляемый элемент не занимал хоть какого-либо места после удаления, но что-то пошло не так...
Меньше чем за 500 циклов память стала под 20Мб для процесса.
Дебаг памяти показывает, что по каким-то причинам число итераторов растет, а то, что они существуют - говорит, что не был вызван их деструктор.
635ea13e39a60477444523.png
  • Вопрос задан
  • 107 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
for (size_t i = iters.size(); i < listsize; i++) {
    iters.push_back(new iterator(typesize));
  }

для такого кода создания код удаления должен вызывать delete а не просто деструктор, т.е.
for (size_t i = iters.size(); i > listsize; i--) {
        delete *iters.back();
        iters.pop_back();
      }


iterator::~iterator() {
  for (stream::stream* s : usedbystreams) {
    s->killstream(0);
  }
  free(pointer);
  usedbystreams.clear();
}

И опять, ты вызвал s->killstream(0), привело ли это к удалению объекта на который указывает s?

Вообще существуют инструменты для отладки работы с памятью, для gcc это прекрасный -fsanitize=address который покажет тебе при завершении программы, где была выделена утекшая память.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы