Консультация № 25099
19.08.2005, 20:32
0.00 руб.
0 2 2
Здравствуйте, уважаемые эксперты.
Необходимо удалить часть динамической памяти(с некоторого значения и доконца), отавив при этом содержимое по тому же адрессу.
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, 23:03
общий
это ответ
Здравствуйте, Ivaan!

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

Приложение:
char *Vars;// выделяете памятьVars=(char*)GlobalAlloc(GMEM_FIXED, 1000);// перевыделяете памятьGlobalReAlloc((HGLOBAL)Vars, <новый размер в байтах>, 0);// освобождаете памятьGlobalFree((HGLOBAL)Vars);
Неизвестный
19.08.2005, 23:47
общий
это ответ
Здравствуйте, Ivaan!
Не выйдет, удалить можно только весь блок т.е. то что выделил
delete [] Vars;
причем в [] не надо ничего писать,
если хоешь удалить кусок то надо или выделить буфер заново и скопировать туда то что тебе надо или писать нестандартное управление памятью.
Форма ответа