Вопрос № 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