Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


Информационный Канал Subscribe.Ru

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Выпуск № 180
от 25.08.2005, 19:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 189, Экспертов: 26
В номере:Вопросов: 1, Ответов: 2


Вопрос № 25099: Здравствуйте, уважаемые эксперты. Необходимо удалить часть динамической памяти(с некоторого значения и доконца), отавив при этом содержимое по тому же адрессу. Vars = new byte[1000]; ......... Index = 1000 - SizeOfVars; Buffer = ...

Вопрос № 25.099
Здравствуйте, уважаемые эксперты.
Необходимо удалить часть динамической памяти(с некоторого значения и доконца), отавив при этом содержимое по тому же адрессу.
Vars = new byte[1000];
.........
Index = 1000 - SizeOfVars;
Buffer = (char*)((int)Vars + SizeOfVars);
delete[Index](byte*)Buffer;
Данный код выдает ошибку (Адресса и все переменные настроены верно)
Debug Assertion Failed
.......
Expression:_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
Работаю под Windows. Подскажите что можно сделать, может возможна более эффективная работа с динамической памятью?
Спасибо.
Отправлен: 19.08.2005, 20:32
Вопрос задал: Ivaan (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Ddeedd
Здравствуйте, Ivaan!

Хотелось бы уточнить, компиляторы C/C++ для стандарта C/C++ версии 2.0 и более забивают на цифру, указанную у delete [] в скобках и убивают массив всегда целиком, но для этого им всегда нужен оригинальный адрес, который был вернут оператором new. Вы подсовываете инвалидный адрес - отсюда и глюк. (только delete [] Vars - будет работать). Если хотите изменять размер выделенного участка памяти, можете использовать WinAPI-шные различные аллоки, вроде LocalAlloc/LocalFree/LocalReAlloc, GlobalAlloc/GlobalFree/GlobalReAlloc, VirtualAlloc/VirtualFree, но от использования new/delete придеться отказаться.

Приложение:

Ответ отправил: Ddeedd (статус: 4-ый класс)
Отправлен: 19.08.2005, 23:03
Оценка за ответ: 5

Отвечает: Raptor1
Здравствуйте, Ivaan!
Не выйдет, удалить можно только весь блок т.е. то что выделил
delete [] Vars;
причем в [] не надо ничего писать,
если хоешь удалить кусок то надо или выделить буфер заново и скопировать туда то что тебе надо или писать нестандартное управление памятью.
Ответ отправил: Raptor1 (статус: 6-ой класс)
Отправлен: 19.08.2005, 23:47


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2005, RusFAQ.ru, Россия, Москва. Все права защищены.
Идея, дизайн, программирование, авторское право: Калашников О.А.

Яндекс


Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.cplus
Отписаться
Вспомнить пароль

В избранное