@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
  • Вопрос задан
  • 103 просмотра
Решения вопроса 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 который покажет тебе при завершении программы, где была выделена утекшая память.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы