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

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

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

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

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

Есть код:

C
1
2
int *ptr;
ptr = (int*)calloc(10, sizeof(int));
собственно вопрос: как освободить только первый элемент массива? не трогая остальные
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: в первый записать отрицательные эле- менты исходного массива, во второй – все остальные....

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 533
09.06.2012, 21:36 #2
В Си - никак. В Си++ подозреваю, можно использовать delete, вместо delete []. Не проверял.

Добавлено через 2 минуты
Впрочем, если используется динамическая структура, где каждый отдельный элемент имеет свой кусок памяти - то... Ну, в общем, понятно. Деревья, списки и прочее поддаются гуглению.
Avazart
Эксперт С++
7152 / 5329 / 278
Регистрация: 10.12.2010
Сообщений: 23,580
Записей в блоге: 17
09.06.2012, 21:38 #3
как освободить только первый элемент массива? не трогая остальные
Так просто не делают... если и освобождают так весь массив....
Ksan
27 / 27 / 0
Регистрация: 02.11.2010
Сообщений: 370
09.06.2012, 21:41  [ТС] #4
AnyOne697, new\delete не умеют довыделять память.

хорошо, а насколько корректна следующая запись?

C
1
2
3
4
5
6
7
int *ptr, *ptr2;
        ptr = (int*)calloc(10, 4);
        for(int i=0; i<10; ++i) ptr[i] = i;
        ptr2 = ptr;
        ptr += 9;
        free(ptr);
        ptr = ptr2;
AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 533
09.06.2012, 21:51 #5
Хм... Не корректна. Вообще. http://codepad.org/zhxvKdfH (смысл тот же).
MikeSoft
Эксперт С++
3793 / 1775 / 85
Регистрация: 21.11.2009
Сообщений: 2,540
09.06.2012, 21:58 #6
Цитата Сообщение от Ksan Посмотреть сообщение
AnyOne697, new\delete не умеют довыделять память.
А написать функцию, возвращающую указатель на "нововыделенную" область памяти (с новым указанным размером) разве не сможете?

Вам правильно советуют:
Цитата Сообщение от AnyOne697 Посмотреть сообщение
В Си - никак. В Си++ подозреваю, можно использовать delete, вместо delete [].
Ksan
27 / 27 / 0
Регистрация: 02.11.2010
Сообщений: 370
09.06.2012, 22:01  [ТС] #7
Цитата Сообщение от MikeSoft Посмотреть сообщение
А написать функцию, возвращающую указатель на "нововыделенную" область памяти (с новым указанным размером) разве не сможете?
Не совсем понял, что вы имеете ввиду под этим?
Мне 2мя указателями оперировать что ли?
Jtalk
93 / 79 / 4
Регистрация: 13.05.2011
Сообщений: 279
09.06.2012, 22:08 #8
Цитата Сообщение от MikeSoft Посмотреть сообщение
Вам правильно советуют:
А как потом доудалить оставшуюся?

Топикстартер, C плохо работает с массивами. Если нужен именно он, то либо realloc, что адски медленно, либо сделать новый указатель, да. Если память нужно будет удалять, то сохранить оригинальный — удаление по измененному указателю, если я правильно помню, работает некорректно.
AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 533
09.06.2012, 22:16 #9
Цитата Сообщение от Ksan Посмотреть сообщение
Не совсем понял, что вы имеете ввиду под этим?
Мне 2мя указателями оперировать что ли?
Цитата Сообщение от MikeSoft Посмотреть сообщение
А написать функцию, возвращающую указатель на "нововыделенную" область памяти (с новым указанным размером) разве не сможете?
Примерно так:
C++
1
2
3
4
5
6
char *realloc(char *p, unsigned size){
   char *t = new char[size];
   memset(t, p, size);
   delete [] p;
   return t;
}

Цитата Сообщение от Jtalk Посмотреть сообщение
А как потом доудалить оставшуюся?
Легко. Указатель не обнуляется.
C++
1
2
3
4
5
6
int main(){
   int *a = new int[12];
   delete a++; //была освобождена память для первого элемента
 
   return 0;
}
Впрочем, я не уверен в возможности сего. Когда использовал, утечек не наблюдалось. Но использовал в небольшой программе - просто хотел немного оптимизировать.

Цитата Сообщение от Jtalk Посмотреть сообщение
C плохо работает с массивами
Сложность работы с ними не обуславливает плохую работу. Си просто идеально работает с массивами. Кроме массивов в Си просто ничего нет ;-)
Ksan
27 / 27 / 0
Регистрация: 02.11.2010
Сообщений: 370
09.06.2012, 22:16  [ТС] #10
Jtalk, realloc медленно работает? вы уверены?
Jtalk
93 / 79 / 4
Регистрация: 13.05.2011
Сообщений: 279
09.06.2012, 22:22 #11
Цитата Сообщение от AnyOne697 Посмотреть сообщение

Легко. Указатель не обнуляется.
Код C++1 2 3 4 5 6 int main(){ int *a = new int[12]; delete a++; //была освобождена память для первого элемента return 0; }
Впрочем, я не уверен в возможности сего. Когда использовал, утечек не наблюдалось. Но использовал в небольшой программе - просто хотел немного оптимизировать.
В данном случае память очистит ОС после закрытия приложения. В стандарте C++ (по крайней мере старом) четко было написано, что модифицировать указатель, выданный new[], нельзя, т.к. это вызовет ошибки при использовании delete[]. Соответственно, удалять память "кусками" можно только если приложение маленькое и небольшие утечки не страшны.


Сложность работы с ними не обуславливает плохую работу. Си просто идеально работает с массивами. Кроме массивов в Си просто ничего нет ;-)
структуры, перечисления, объединения, функции, etc.
А как еще обозначить плохую работу? Что угодно можно сделать библиотеками, удобство работы с массивами — это в первую очередь качество их поддержки языком. А C дальше указателей на память массивы никогда не поддерживал.

Добавлено через 1 минуту
Цитата Сообщение от Ksan Посмотреть сообщение
Jtalk, realloc медленно работает? вы уверены?
По сравнению с инкрементом указателя? На порядки. realloc просто выделяет новый кусок памяти и делает memcpy куска старой памяти в новую. Соответственно, замедление зависит от объема выделяемой и копируемой памяти. Насколько я помню, realloc не умеет оптимизировать этот процесс.
Ksan
27 / 27 / 0
Регистрация: 02.11.2010
Сообщений: 370
09.06.2012, 22:27  [ТС] #12
Jtalk, я думал, что реаллок выделяет кусок памяти и "клеит" его к старому
Jtalk
93 / 79 / 4
Регистрация: 13.05.2011
Сообщений: 279
09.06.2012, 22:30 #13
Цитата Сообщение от Ksan Посмотреть сообщение
Jtalk, я думал, что реаллок выделяет кусок памяти и "клеит" его к старому
Сейчас посмотрел, да, он может так делать. Но это не гарантируется. Да и вам надо "отклеить".
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
09.06.2012, 22:43 #14
Цитата Сообщение от AnyOne697 Посмотреть сообщение
Легко. Указатель не обнуляется.
C++
1
2
3
4
5
6
int main(){
   int *a = new int[12];
   delete a++; //была освобождена память для первого элемента
 
   return 0;
}
Такой вопрос:
C++
1
2
3
4
5
6
int main(){
   int *a = new int[12];
   delete a++; //была освобождена память для первого элемента
   delete [] a;
   return 0;
}
Как система узнает, что надо удалить 11 элементов начиная с адреса a?
AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 533
09.06.2012, 22:46 #15
Цитата Сообщение от Chelioss Посмотреть сообщение
Как система узнает, что надо удалить 11 элементов начиная с адреса a?
Она вывалит exception. Так что надо будет в цикле удалять по одному. Ранее уже говорилось, что это чревато утечками. Если программа небольшая (пару сотен килобайт) - ОС сама освободит память после завершения работы.

А вообще, преждевременная оптимизация - корень всех зол.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.06.2012, 22:46
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
09.06.2012, 22:46
Ответ Создать тему
Опции темы

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