@devEngineer

Нужно ли вообще очищать память в этом месте?

У меня есть функция которая удаляет символ из строки, путем создания новой строки и возврата указателя на эту строку. Нужно ли вообще очищать память в старом указателе?
char* erase_symbol(char* string, int index)
{
	const int size = _strlen(string) - 1;
	char* _string = (char*)malloc(sizeof(char) * size);
	for (int i = 0; i < index; i++)
	{
		*(_string + i) = *(string + i);
	}
	for (int i = index; i < size; i++)
	{
		*(_string + i) = *(string + i + 1);
	}
	free(string);  // в этой строке программа крашится
	return _string;
}
  • Вопрос задан
  • 177 просмотров
Решения вопроса 1
zagayevskiy
@zagayevskiy
Android developer at Yandex
Первый вопрос - зачем она это делает таким способом?
Очистить память нужно, но не здесь. Очистить должен тот, кто вызывает эту функцию.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
jcmvbkbc
@jcmvbkbc
http://dilbert.com/strip/1998-08-24
Нужно ли вообще очищать память в старом указателе?

Зависит от логики этой функции: если string всегда выделена в куче и нигде не остаётся ссылок на неё, то можно её освобождать. В противном случае -- нет.

В функции, кстати, нигде не проверяется, что index меньше длины исходной строки, а если случайно передать слишком большой index, функция поломает кучу, записывая за пределы выделенного буфера.
Ответ написан
CityCat4
@CityCat4
Кошки не похожи на людей, кошки - это кошки!
Программа крашится потому что неосторожное обращение с памятью способно разломать таблицу выделенных участков, в результате чего при попытке освободить память будет происходить фигня. Внимательно погоняйте программу отладчиком и посмотрите - не выходит ли у вас *_string за допустимые пределы.
Ответ написан
Ваш ответ на вопрос

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

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