Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Удаление хвоста массива, можно ли? 
V
    Опции темы
VirtualVoid
Дата 17.11.2009, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 4.8.2009
Где: Сибирь

Репутация: нет
Всего: 1



Можно ли удалять не весь массив из кучи, начиная с указателя на 1-ый элемент, а только конец, начиная откуда-то?

Поясню на примере:

Код

int *arr=new int[20];
int *ptr=arr+15;
delete[] ptr;


Т.е. удалит ли последняя строка кода элементы с 15 по 19?


При компиляции компилятором от microsoft такая программа разваливается, что вполне логично.
Короче суть вопроса: есть ли такой компилятор(или платформа), где подобное возможно?

Подозреваю, что это можно сделать, переопределив new, delete, сделав умные указатели, но моя проблема не стОит таких усилий...

PM MAIL ICQ   Вверх
mes
Дата 17.11.2009, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(VirtualVoid @  17.11.2009,  18:06 Найти цитируемый пост)
Можно ли удалять не весь массив из кучи, начиная с указателя на 1-ый элемент, а только конец, начиная откуда-то?

если c++ то пользуйте вектор для подобных целей.


--------------------
PM MAIL WWW   Вверх
null56
Дата 17.11.2009, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 2
Всего: 12



VirtualVoid, поддерживаю mes, но еще есть вариант создавать массив через
Код

       void *realloc(void *ptr, size_t size);

Тут выделяешь участки памяти и сам их заполняешь элементами
Если применить эту функцию для существующего участка памяти, в котором располагается массив, созданного функцией семейства "ALLOC", но указать размер меньше реального, то если мне не ошибает память, байты выходящие за новый размер памяти почистятся... другой вопрос, что элементы располагаемые в отсекаемом участке нужно будет чистить самому, если это динамически созданные объекты...
PM MAIL   Вверх
Earnest
Дата 17.11.2009, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



mes, вектор реально ничего не освобождает вплоть до удаления... впрочем, это зависит от реализации, но чаще всего память перераспределяется только в сторону увеличения. 

Цитата(null56 @  17.11.2009,  20:30 Найти цитируемый пост)
байты выходящие за новый размер памяти почистятся... 

не почистятся, а просто уменьшиться объем выделенного блока. "Чистить", т.е. чем-то заполнять никто не будет.

Цитата(VirtualVoid @  17.11.2009,  20:06 Найти цитируемый пост)
При компиляции компилятором от microsoft такая программа разваливается, что вполне логично.
Короче суть вопроса: есть ли такой компилятор(или платформа), где подобное возможно?

Не знаю такого. Освобождать можно только то, что заказано. Иначе слишком усложнится работа с кучей. А ради чего?

Цитата(VirtualVoid @  17.11.2009,  20:06 Найти цитируемый пост)
но моя проблема не стОит таких усилий...

Вот-вот. Если дело идет о паре байтов, то говорить не о чем. А если о паре мегабайтов и прочих больших блоках, то имеет смысл реализовать свою схему работы с памятью, для данных конкретных объектов, конечно, и с нужными свойствами.



--------------------
...
PM   Вверх
ИванМ
Дата 17.11.2009, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 1
Всего: 23



VirtualVoid, в твоем случае не имеет смысла удалять элементы. Просто храни где-нибудь фактическое количесто элементов, а сам массив не трогай.
PM MAIL   Вверх
mes
Дата 17.11.2009, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Earnest @  17.11.2009,  18:56 Найти цитируемый пост)
вектор реально ничего не освобождает вплоть до удаления...

полагаю автору реального удаления и не надо.. мое высказывание основывалось на предположении, что автор пока сам не знает что ему требуется, но ему не хватает удобной работы с динамическим массивом.
smile



--------------------
PM MAIL WWW   Вверх
VirtualVoid
Дата 17.11.2009, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 4.8.2009
Где: Сибирь

Репутация: нет
Всего: 1



Про вектор в курсе, но он только увеличивается, освобождается он и вправду сразу полностью при удалении.
Другие контейнеры тоже не особо хочется из-за быстродействия(оно сверхкритично), и опять же, дополнительная информация...

Насчет реаллок.. Все выделяется через new, а стандарт не гарантирует, что там внутри что-то из семейства ALLOC, хотя фактически оно часто так и есть.

Цитата(ИванМ @  18.11.2009,  01:11 Найти цитируемый пост)
VirtualVoid, в твоем случае не имеет смысла удалять элементы. Просто храни где-нибудь фактическое количесто элементов, а сам массив не трогай. 


Это уже делается, хотелось бы память вычистить.

Earnest
Ну это я и хотел узнать. Если нельзя, значит нельзя! 

Спасибо всем ответившим!

Добавлено через 2 минуты и 13 секунд
Цитата(mes @  18.11.2009,  01:45 Найти цитируемый пост)

полагаю автору реального удаления и не надо.. мое высказывание основывалось на предположении, что автор пока сам не знает что ему требуется, но ему не хватает удобной работы с динамическим массивом.

Надо именно реальное удаление. Иначе говоря, будь у меня изначально список, вопрос бы не стоял.

PM MAIL ICQ   Вверх
Dov
Дата 17.11.2009, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 15
Всего: 88



Цитата(VirtualVoid @  17.11.2009,  18:06 Найти цитируемый пост)
int *arr=new int[20];
int *ptr=arr+15;
delete[] ptr;

это делается примерно так:
Код
int *arr = new int[20];
// ...

int *ptr = arr;

arr = new int[15];
for(int i = 0; i < 15; i++)
    arr[i] = ptr[i];
delete [] ptr;
// ...

delete [] arr;




--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
BlackJackal
Дата 17.11.2009, 22:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 15.11.2009
Где: Красноярск

Репутация: нет
Всего: нет



Цитата(Earnest @ 17.11.2009,  19:56)
mes, вектор реально ничего не освобождает вплоть до удаления... впрочем, это зависит от реализации, но чаще всего память перераспределяется только в сторону увеличения.

Тут автор блога рассказывает про прием SwapTrick для очистки вектора. Уж не знаю, насколько это удовлетворяет быстродействию, но работает.
PM MAIL   Вверх
VirtualVoid
Дата 18.11.2009, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 4.8.2009
Где: Сибирь

Репутация: нет
Всего: 1



Dov
Я понимаю. В том то и дело, что мне не нужна промежуточная аллокация. Реальный объем выделенного может близко подходить к физическому размеру оперативной памяти, при выделении объема близкого к нему(arr = new int[......];), пойдет совсем ненужный своппинг.
Лучше бы вобще не было такой памяти =)
PM MAIL ICQ   Вверх
Dov
Дата 18.11.2009, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 15
Всего: 88



Цитата(VirtualVoid @  18.11.2009,  17:10 Найти цитируемый пост)
Реальный объем выделенного может близко подходить к физическому размеру оперативной памяти

Это круто... и даже очень...   smile 

з.ы. счас глянул, у меня на компе 2 гб оперативки...  smile 




--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
mes
Дата 18.11.2009, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(VirtualVoid @  18.11.2009,  17:10 Найти цитируемый пост)
Реальный объем выделенного может близко подходить к физическому размеру оперативной памяти,

т.е. Вам по задаче необходим  один сплошной  массив предельного размера ?  практически всегда можно найти способ более оптимального использования памяти.



--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1574 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.