![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
polin11 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 125 Регистрация: 6.6.2015 Репутация: нет Всего: нет |
Подскажите, программа состоит из 2 функций (main и fun), программа меняет значение указателя на символьный массив созданный в динамически распределяемой памяти.
Программ меняет символьный массив "abc" на "cba" ошибок нет. Вопрос в другом, нужно ли удалять указатель из кучи в функции main или fun, не произойдет ли утечка памяти, не становиться ли указатель str_f из функции fun "диким" при завершении функции fun??? При попытке удалить указатель delete str_f или delete[] str_f, при выполнении программы выходит ошибка.
|
|||
|
||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 11 Всего: 45 |
Вот подумайте сами. Вы высвободите запрошенный массив символов, а указатель на него вернёте из функции. На что будет указывать этот указатель? Он, конечно, будет указывать куда-тов память процесса, но куда? Неизвестно. Указатель стал невалидным, использовать в дальнейшем его категорически нельзя. В этом смысле такой код мало чем отличается от такого:
ЗЫ Массив высвобождается через delete [] ..., а не просто delete. Но что Вы делаете в коде. После выделения участка памяти под массив, Вы изменяете значение указателя: присваивая ему значение, указывающее на константную строчку (этот код никоим образом не копирует строчку "cba" в выделенный массив). В результате у Вас указатель str_f указывает на константную строчку, а не на выделенный участок памяти. Высвовождение невыделенного и приводит к ошибке. Тупо это проверьте, выведя на экран значение указателя str_f до присвоения константной строчкой и после. Увидите, что значение указателя круто изменилось. -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
TarasProger |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 104 Регистрация: 5.8.2015 Репутация: нет Всего: нет |
polin11, утечка произошла уже в 25-й строке: в 21-й память по указателю была выделена, а адрес, где именно выделена, записано в указателе и нигде больше, потом в 25-й строке указателю присвиваеется значение функции, которая тоже что то выделила и вернула адрес, где именно выделила. Так как указатель поменял свою значение при этом присваивании, то старое значение с адресом выдения в 21-й строке потерялось. Раз ты по этому указателю выделял память, то прежде чем менять его значение, надо память освободить. Совсем другое дело
Это сообщение отредактировал(а) TarasProger - 12.8.2015, 10:56 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |