Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Ksan
27 / 27 / 0
Регистрация: 02.11.2010
Сообщений: 370
#1

как освободить только первый элемент массива, не трогая остальные? - C++

09.06.2012, 21:26. Просмотров 1250. Ответов 20
Метки нет (Все метки)

Есть код:

C
1
2
int *ptr;
ptr = (int*)calloc(10, sizeof(int));
собственно вопрос: как освободить только первый элемент массива? не трогая остальные
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.06.2012, 21:26
Здравствуйте! Я подобрал для вас темы с ответами на вопрос как освободить только первый элемент массива, не трогая остальные? (C++):

Первый элемент массива равен 1 а остальные почему-то нулю - C++
Здраствуйте есть вопрос к задаче: дана программу реализовывающую вычисление последовательности Фиббоначи до определённого номера...

Выводит только первый элемент массива символов - C++
Потом вместо каждого символа выводит что-то вроде |for (int i = 0; i < 100; i++) { printf("%c\n", fault); }

Выводится в файл только первый символ строки, остальные пустые - C++
Есть код обработчика нажатия.По идее,ставя точки останова и проверяя значения все значения получаются правильно.Но при выводе в файл эти 5...

Создать два новых массива: в первый перенести все цифры из исходного массива, во второй - все остальные символы - C++
Задан массив из k символов.Создать два новых массива: в первый перенести все цифры из исходного массива, во второй - все остальные символы....

Как проверить первый элемент двумерного массива на 0? - C++
Всем привет. Дана функция ввода элементов двумерного массива. Необходимо вставить условие: если первый элемент массива равен 0, то...

Сформировать два массива из исходного: в первый записать отрицательные элементы, во второй – остальные - C++
Сформировать два новых массива из одномерного K: в первый записать отрицательные эле- менты исходного массива, во второй – все остальные....

20
Chelioss
180 / 180 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
09.06.2012, 22:50 #16
Цитата Сообщение от AnyOne697 Посмотреть сообщение
Она вывалит exception.
Неопределенное поведение.
Цитата Сообщение от AnyOne697 Посмотреть сообщение
Так что надо будет в цикле удалять по одному.
Недостаточно. В смысле не все освободиться.

Цитата Сообщение от AnyOne697 Посмотреть сообщение
Если программа небольшая (пару сотен килобайт) - ОС сама освободит память после завершения работы.
А если большая, то не освободит?
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
10.06.2012, 22:46 #17
Цитата Сообщение от AnyOne697 Посмотреть сообщение
В Си++ подозреваю, можно использовать delete, вместо delete []. Не проверял.
да за такое надо наказывать. жестоко наказывать - это же UB
 Комментарий модератора 
Прекращаем оффтоп!
1
AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 533
11.06.2012, 19:16 #18
Цитата Сообщение от Jupiter Посмотреть сообщение
да за такое надо наказывать. жестоко наказывать - это же UB
Я сначала обиделся за вырезанные сообщения, но потом понял, что Вы ещё что-то добавили...

Только вот пояснить забыли. Если удалить весь массив через цикл - утечек быть не должно. Вывод - если требуется более продвинутая (читай, удобная) модель менеджмента памяти - делаем её сами. За что наказывать-то?
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
11.06.2012, 20:19 #19
Цитата Сообщение от AnyOne697 Посмотреть сообщение
Только вот пояснить забыли. Если удалить весь массив через цикл - утечек быть не должно. Вывод - если требуется более продвинутая (читай, удобная) модель менеджмента памяти - делаем её сами. За что наказывать-то?
отвечаю:
5.3.5 Delete
1
[expr.delete]
The delete-expression operator destroys a most derived object (1.8) or array created by a new-expression.
delete-expression:
::opt delete cast-expression
::opt delete [ ] cast-expression
The first alternative is for non-array objects, and the second is for arrays. The operand shall have a pointer
type, or a class type having a single conversion function (12.3.2) to a pointer type. The result has type
void.
2 If the operand has a class type, the operand is converted to a pointer type by calling the above-mentioned
conversion function, and the converted operand is used in place of the original operand for the remainder of
this section. In either alternative, if the value of the operand of delete is the null pointer the operation
has no effect. In the first alternative (delete object), the value of the operand of delete shall be a pointer
to a non-array object or a pointer to a sub-object (1.8) representing a base class of such an object (clause
10). If not, the behavior is undefined. In the second alternative (delete array), the value of the operand of
delete shall be the pointer value which resulted from a previous array new-expression.72) If not, the
behavior is undefined.
[Note: this means that the syntax of the delete-expression must match the type of the object allocated by new, not the syntax of the new-expression. ] [Note: a pointer to a const type can be
the operand of a delete-expression; it is not necessary to cast away the constness (5.2.11) of the pointer
expression before it is used as the operand of the delete-expression. ]
стандарт С++ от 2003
0
AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 533
12.06.2012, 00:47 #20
Хм. А Вы возможно забыли тот факт, что ни GCC ни Visual C++ полностью стандарту не соответствуют. Поэтому в первую очередь RTFM, а затем, j4f, RTFS.
Хотя да. Почитал Интернеты, вот пара линков. Правда неопределённое поведение. И ещё. Здесь подраздел "... для новичков". Поэтому не стоит кидать непереведённый стандарт, английский вообще и тем более: важные в контексте сленговые аббревиатуры-сокращения. Просто потому что, я, например, понятия не имел что есть "UB", но должен был понять для понимания причины, по которой меня должны наказать.
P.S. Самый Главный Линк
0
grizlik78
Эксперт С++
1964 / 1457 / 119
Регистрация: 29.05.2011
Сообщений: 3,016
12.06.2012, 01:17 #21
C
1
2
3
4
5
int *ptr;
ptr = (int*)calloc(10, sizeof(int));
 
memmove(ptr, ptr+1, 9*sizeof(int));
ptr = (int*)realloc(ptr, 9*sizeof(int));
Только вот уменьшать область памяти на 1 элемент может оказаться излишним и накладным. Возможно лучше завести 2 размера: один показывает размер выделенной области памяти, второй — количество действительных элементов массива. Тогда если придётся добавлять элемент не придётся по новой довыделять память. А выделять/освобождать память можно будет значительными порциями.

Добавлено через 4 минуты
И да, если элементы двигать нельзя, то ответ на исходный вопрос прост: никак.
0
12.06.2012, 01:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.06.2012, 01:17
Привет! Вот еще темы с ответами:

Как удалить из одномерного массива первый отрицательный элемент - C++
Как удалить из одномерного массива первый отрицательный элемент for (i=0; i<SIZE; i++) if (a==0) delete a вот эта...

Как определить первый с конца четный элемент двумерного массива? - C++
двумерный массив. Как определить первый с конца четный элемент двумерного массива? Как написать цикл for с конца в начало.

Дан массив F[0:n-1].Сформировать два новых массива: первый содержит элементы, не превышающие заданного числа, а второй - все остальные - C++
Помогите пожалуйста.Нужен полный текст программы, заранее благодарен

Из положительных элементов массива вычесть первый элемент, из остальных - второй элемент - C++
Дан массив L(7). Из положительных элементов вычесть первый элемент, из остальных - второй элемент. Вывести новый массив на печать.2 3 -4 ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
21
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru