27 / 27 / 4
Регистрация: 02.11.2010
Сообщений: 370
|
||||||
1 | ||||||
как освободить только первый элемент массива, не трогая остальные?09.06.2012, 21:26. Показов 2305. Ответов 20
Метки нет (Все метки)
Есть код:
0
|
09.06.2012, 21:26 | |
Ответы с готовыми решениями:
20
Первый элемент массива равен 1 а остальные почему-то нулю Выводит только первый элемент массива символов Ошибка: Выводится только первый элемент массива Как отформатировать второй диск не трогая первый? |
134 / 106 / 10
Регистрация: 22.05.2010
Сообщений: 533
|
|
09.06.2012, 21:36 | 2 |
В Си - никак. В Си++ подозреваю, можно использовать delete, вместо delete []. Не проверял.
Добавлено через 2 минуты Впрочем, если используется динамическая структура, где каждый отдельный элемент имеет свой кусок памяти - то... Ну, в общем, понятно. Деревья, списки и прочее поддаются гуглению.
0
|
27 / 27 / 4
Регистрация: 02.11.2010
Сообщений: 370
|
||||||
09.06.2012, 21:41 [ТС] | 4 | |||||
AnyOne697, new\delete не умеют довыделять память.
хорошо, а насколько корректна следующая запись?
0
|
134 / 106 / 10
Регистрация: 22.05.2010
Сообщений: 533
|
|
09.06.2012, 21:51 | 5 |
Хм... Не корректна. Вообще. http://codepad.org/zhxvKdfH (смысл тот же).
0
|
3953 / 1808 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
|
|
09.06.2012, 21:58 | 6 |
А написать функцию, возвращающую указатель на "нововыделенную" область памяти (с новым указанным размером) разве не сможете?
Вам правильно советуют:
0
|
27 / 27 / 4
Регистрация: 02.11.2010
Сообщений: 370
|
|
09.06.2012, 22:01 [ТС] | 7 |
Не совсем понял, что вы имеете ввиду под этим?
Мне 2мя указателями оперировать что ли?
0
|
95 / 81 / 3
Регистрация: 13.05.2011
Сообщений: 279
|
|
09.06.2012, 22:08 | 8 |
А как потом доудалить оставшуюся?
Топикстартер, C плохо работает с массивами. Если нужен именно он, то либо realloc, что адски медленно, либо сделать новый указатель, да. Если память нужно будет удалять, то сохранить оригинальный — удаление по измененному указателю, если я правильно помню, работает некорректно.
0
|
134 / 106 / 10
Регистрация: 22.05.2010
Сообщений: 533
|
|||||||||||
09.06.2012, 22:16 | 9 | ||||||||||
Примерно так:
Легко. Указатель не обнуляется.
Сложность работы с ними не обуславливает плохую работу. Си просто идеально работает с массивами. Кроме массивов в Си просто ничего нет ;-)
0
|
27 / 27 / 4
Регистрация: 02.11.2010
Сообщений: 370
|
|
09.06.2012, 22:16 [ТС] | 10 |
Jtalk, realloc медленно работает? вы уверены?
0
|
95 / 81 / 3
Регистрация: 13.05.2011
Сообщений: 279
|
|
09.06.2012, 22:22 | 11 |
В данном случае память очистит ОС после закрытия приложения. В стандарте C++ (по крайней мере старом) четко было написано, что модифицировать указатель, выданный new[], нельзя, т.к. это вызовет ошибки при использовании delete[]. Соответственно, удалять память "кусками" можно только если приложение маленькое и небольшие утечки не страшны.
А как еще обозначить плохую работу? Что угодно можно сделать библиотеками, удобство работы с массивами — это в первую очередь качество их поддержки языком. А C дальше указателей на память массивы никогда не поддерживал. Добавлено через 1 минуту По сравнению с инкрементом указателя? На порядки. realloc просто выделяет новый кусок памяти и делает memcpy куска старой памяти в новую. Соответственно, замедление зависит от объема выделяемой и копируемой памяти. Насколько я помню, realloc не умеет оптимизировать этот процесс.
0
|
27 / 27 / 4
Регистрация: 02.11.2010
Сообщений: 370
|
|
09.06.2012, 22:27 [ТС] | 12 |
Jtalk, я думал, что реаллок выделяет кусок памяти и "клеит" его к старому
0
|
95 / 81 / 3
Регистрация: 13.05.2011
Сообщений: 279
|
|
09.06.2012, 22:30 | 13 |
Сейчас посмотрел, да, он может так делать. Но это не гарантируется. Да и вам надо "отклеить".
0
|
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
|
||||||
09.06.2012, 22:43 | 14 | |||||
Такой вопрос:
0
|
134 / 106 / 10
Регистрация: 22.05.2010
Сообщений: 533
|
|
09.06.2012, 22:46 | 15 |
Она вывалит exception. Так что надо будет в цикле удалять по одному. Ранее уже говорилось, что это чревато утечками. Если программа небольшая (пару сотен килобайт) - ОС сама освободит память после завершения работы.
А вообще, преждевременная оптимизация - корень всех зол.
0
|
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
|
|
09.06.2012, 22:50 | 16 |
Неопределенное поведение.
Недостаточно. В смысле не все освободиться. А если большая, то не освободит?
0
|
134 / 106 / 10
Регистрация: 22.05.2010
Сообщений: 533
|
|
11.06.2012, 19:16 | 18 |
Я сначала обиделся за вырезанные сообщения, но потом понял, что Вы ещё что-то добавили...
Только вот пояснить забыли. Если удалить весь массив через цикл - утечек быть не должно. Вывод - если требуется более продвинутая (читай, удобная) модель менеджмента памяти - делаем её сами. За что наказывать-то?
0
|
134 / 106 / 10
Регистрация: 22.05.2010
Сообщений: 533
|
|
12.06.2012, 00:47 | 20 |
Хм. А Вы возможно забыли тот факт, что ни GCC ни Visual C++ полностью стандарту не соответствуют. Поэтому в первую очередь RTFM, а затем, j4f, RTFS.
Хотя да. Почитал Интернеты, вот пара линков. Правда неопределённое поведение. И ещё. Здесь подраздел "... для новичков". Поэтому не стоит кидать непереведённый стандарт, английский вообще и тем более: важные в контексте сленговые аббревиатуры-сокращения. Просто потому что, я, например, понятия не имел что есть "UB", но должен был понять для понимания причины, по которой меня должны наказать. P.S. Самый Главный Линк
0
|
12.06.2012, 00:47 | |
12.06.2012, 00:47 | |
Помогаю со студенческими работами здесь
20
Правильно выводится только первый элемент полученного массива Выводится в файл только первый символ строки, остальные пустые Почему при создании динамического массива, отладчик видит только один первый элемент? Поменять местами первый максимальный четный элемент массива и первый минимальный нечетный элемент Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |