@daniil14056

Почему программа ломается при освобождении памяти?

Вот так выглядет вырезанный код,
readLine() возращает new char[length] . Потом собираюсь освободить память и все крашиться, при этом если не удалять (убрать delete [] ) то будет утечка.
В чем может быть ошибка
void run(SocketListener* _this) {
	char *ret = NULL;
	try {
		for (;;) {
			ret = _this->readLine(); // вернет new char[len];
			if (ret == NULL) break;
			std::cout << ret;
			_this->getSocket()->send(response, lenResponse);

			delete[]ret;  // !!!!!!!!!!!!!!! ЛОМАЕТСЯ
		}
		//	} while (reads_bytes > 0 /*&& len==reads_bytes*/);

	}
	catch (std::runtime_error & err) {
		//std::cout << "ERROR  "<<err.what() << std::endl;
		if (ret != NULL) delete[]ret;
	}
	delete[] buf;
}
char * _Interface_Socket::readLine()
{
	std::string line = "";
	char buf[1];
	try {
		do {
			int reads_bytes = socket->recv(buf, 1);
			if (reads_bytes < 1) return NULL;
			line.push_back(buf[0]);

		} while (buf[0] != '\n');
	}
	catch (std::runtime_error &err) {
		status = false;
		return NULL;
	}
	char *response = new char[line.size()];
	std::strcpy(response, line.c_str());
	return response;
}
  • Вопрос задан
  • 152 просмотра
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Почему программа ломается при освобождении памяти?

Потому что во время работы кто-то вылез за пределы выделенной памяти и перезаписал служебную информацию в куче. Простейший способ отладить это -- запуском программы под valgrind.
Но в этом вопросе всё проще:

char *response = new char[line.size()];
  std::strcpy(response, line.c_str());


Должно быть char *response = new char[line.size() + 1];
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
vt4a2h
@vt4a2h Куратор тега C++
Senior software engineer (C++/Qt/boost)
Для начала, я бы убрал явное использование new/delete. Это всё-таки C++. У вас есть класс std::string, его и используйте везде (например при возврате значений). Этот класс предоставляет метод reserve, чтобы выделить необходимое количество памяти. У него есть метод data, если необходимо передать в C API char*.

Вполне возможно, что у вас не крэш, а программа просто висит на send/post, ожидая ответа. Это тоже стоит проверить.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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