![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Baa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2639 Регистрация: 12.4.2002 Где: Москва Репутация: 8 Всего: 12 |
Есть у нас динамический массив...
char* lpBuffer = new char [0xFF]; И он у нас заполнен чем-то (не важно чем). Далее, нам надо его расширить... lpBuffer = new char [0x200]; но вот беда, данные-то потерялись Вопрос: можно ли как-то обойтись без временного второго массива? -------------------- "Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande |
|||
|
||||
| Step |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5151 Регистрация: 26.9.2002 Где: дурдом.UA Репутация: 5 Всего: 25 |
думаю что нельзя ведь нею выделяет тебе новую область памяти, разве что если ты уверен что у тебя после твоего массива память не используется, можеш попробувать создать масив на больше как ты это делал, потом его удаляеш, и указатель ставиш на первый масив, память тажа, но элементов больше.
-------------------- - Дурак учится на своих ошибках, умный на чужих. - умные учатся у дураков |
|||
|
||||
| Alex101 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 891 Регистрация: 8.4.2002 Где: Москва Репутация: нет Всего: 10 |
Ежели говорить о реализации вообще (не опираясь на конкретный язык или его реализацию), то нельзя - память-то RAM, все ухищрения приведут к одному и тому же - сначала часть выделенной памяти не будет использоваться. А так - есть классы, позволяющие это реализовывать.
ЗЫ Делал я программу под ДОС, она работала в графическом режиме, использовал текстовый буфер для хранения данных. Но это так, к слову пришлось -------------------- С уважением, А. Фролов. |
|||
|
||||
| AntonSaburov |
|
|||
![]() Штурман ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5658 Регистрация: 2.7.2002 Где: Санкт-Петербург Репутация: нет Всего: 118 |
Для таких случаев можно использовать STL - std::vector<char>
И никаких проблем больше нет |
|||
|
||||
| Baa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2639 Регистрация: 12.4.2002 Где: Москва Репутация: 8 Всего: 12 |
Тош, дык можно и CArray... а мне вот хоца без излишеств (MFC, ATL и т.д.)... но как я понял, в любом случае, получается камасутра, а усложнять код не стоит...
-------------------- "Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande |
|||
|
||||
| Alex101 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 891 Регистрация: 8.4.2002 Где: Москва Репутация: нет Всего: 10 |
Ежели приложение небольшое, то конечно. А иначе - лучше перегрузить немного, но будет удобнее работать и за отладкой меньше времени просидишь. -------------------- С уважением, А. Фролов. |
|||
|
||||
| AntonSaburov |
|
|||
![]() Штурман ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5658 Регистрация: 2.7.2002 Где: Санкт-Петербург Репутация: нет Всего: 118 |
STL - это уже стандарт, который есть практически на всех сишных компиляторах. Так что вполне нормально его использовать. Тем более если проект достаточно большой, то смысл изобретать велосипед. |
|||
|
||||
| Baa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2639 Регистрация: 12.4.2002 Где: Москва Репутация: 8 Всего: 12 |
Дык проект небольшой
-------------------- "Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande |
|||
|
||||
| dim |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 106 Регистрация: 24.12.2002 Репутация: нет Всего: нет |
Ну можно еще написать класс массива, в котором к примеру, перегрузить операторы new и delete. Оператор new перегрузить таким образом, что если он вызывается первый раз, то вызывать HeapAlloc, все последующие разы вызываем HeapReAlloc. Затраты конечно же будут, но в kernel mode менее ощутимо чем в user mode. К тому же можно интеллектуально использовать флаг HEAP_REALLOC_IN_PLACE_ONLY. Первый раз HeapReAlloc вызываем с этим флагом (т.е. пытаемся увеличить размер не перенося содержимое), если не вышло то вызываем HeapReAlloc уже без этого флага.
--------------------
that's all |
|||
|
||||
| suborg |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 190 Регистрация: 29.4.2002 Где: Москва Репутация: нет Всего: нет |
Точно нельзя потому что массив в данном случае - непрерывная область памяти, но система работы кучей умеет выделять память не только из хвоста кучи, но и из дырок при фрагментации памяти в процессе работы программы, таким образом ты никогда не застрахован от того, что вслед за твоим массивом идут другие данные, следовательно по тому же адресу выделить массив другого размера нельзя, значит придется делать новый массив.
|
|||
|
||||
| dim |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 106 Регистрация: 24.12.2002 Репутация: нет Всего: нет |
Да, но в том случае если за массивом дырка переноса не будет, т.е при перевыделении есть значительная вероятность что переноса не будет, тогда как при простом ремейке перенос будет всегда.
--------------------
that's all |
|||
|
||||
| Fantasist |
|
|||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
dim, правильно сказал. Даже если ты хочешь самы простой массив - все равно его лучше обернуть в класс. Идея по реализации, правда, была предложенна весьма геморная.
Реализация realloc зависит от задачи(как, на самом деле, и реализация аллокации). Если это будет использоваться только с простыми типами, то подойдет почти любой способ - и с вин API и с malloc/realloc и также new/delete/memcpy. Если будут использоваться массивы классов, то надо вызывать конструкторы и деструкторы, а при реаллокации еще и поэлементно копировать (с помощью operator=), но для этого надо знать сколько копировать, а значит либо хранить длинну внутри класса, либо.... -------------------- Волны гасят ветер... |
|||
|
||||
| Nastya |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 27.3.2002 Где: Мариуполь Репутация: 5 Всего: 44 |
Есть два варианта:
1. Прользоваться new, но перед повторным выдлением памяти копировать массив во временный, удалять его, создавать новы и копировать наместо. 2. Пользоваться функциями malloc и realloc из библионтеки stdlib -------------------- Что бы понять рекурсию, надо понять рекурсию "Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор |
|||
|
||||
| Baa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2639 Регистрация: 12.4.2002 Где: Москва Репутация: 8 Всего: 12 |
Насть, дык я ж грю, что эти варианты не подходят... мне-то было интересно, можно ли с помощью new... а другие варианты я и сам знаю з.ы. сам делаю через временный массив (если токо с winapi). -------------------- "Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande |
|||
|
||||
| dim |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 106 Регистрация: 24.12.2002 Репутация: нет Всего: нет |
Один раз реализовать, а потом можно использовать. Вот пример:
--------------------
that's all |
||||
|
|||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |