• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Ошибка при выделении памяти.

  • Автор темы Raschet5
  • Дата начала
Статус
Закрыто для дальнейших ответов.
R

Raschet5

Написанная программа нормально работала до тех пор пока требовалось ей не более 1,5 гига оперативы. (Обрабатываю очень большие объёмы данных и это не СУБД).
После того как программа доходит до 1,5 гига выдаётся сообщение об ошибке :

Project Project1.exe raised exception class std::bad_alloc message 'Exception Object Address:0x7FEEB796'. Process stopped. Use Step or Run to continue.

В программе естественно останавливается на операторе new.
При меньшем количестве данных программа отрабатывает нормально.

Операционка - Vista 32 pro. Builder 6. Оперативки 3 гига.

Где искать? В чём проблема? Подскажите кто знает.
 
E

evgeny2k

Боюсь, что мой ответ тебя не устроит, попробуй воспользоваться VirtualAlloc().
Быстрый пример:
Код:
#define SIZE_16М	0x01000000
LPVOID lpvFlashBuf = VirtualAlloc(NULL, SIZE_16М,
MEM_RESERVE | MEM_COMMIT | MEM_TOP_DOWN ,
PAGE_READWRITE);
if(lpvFlashBuf )
{
ZeroMemory(lpvFlashBuf, SIZE_16М);

// Пишем байтами
LPBYTE lpbPtr = lpvFlashBuf;
lpbPtr[0] = 1;
lpbPtr[1] = 2;
...
lpbPtr[SIZE_16М-1] = 0xFF;

// Пишем словами
LPBYTE lpwPtr = lpvFlashBuf;
lpwPtr[0] = 0x0201;
...

lpwPtr[SIZE_16М/2-1] = 0xFFFE;
...
VirtualFree(lpvFlashBuf, 0, MEM_RELEASE);
}
В общем, идея понятна.
Могут быть проблемы с выделениями больших объемов (200М и больше)за один раз, но в остальном должно работать.
 
R

Raschet5

Спасибо. Думаю, если буду переходить на такое распределение памяти, быстродействие сильно не увеличится. Я тут кое-что изменил в программе у себя за это время и пришёл к интересным выводам.
Мне пришлось оптимизировать работу с памятью, поскольку не знал каким образом увеличить максимум. При максимальных нагрузках хватает 1,3 гига. Но быстродействие теряется в три раза, при таких объёмах обработки (скорость = Объем обрабатываемой информации / Время обработки). Что для меня оказалось неприемлемым. Даже если мне удастся работать с VirtualAlloc(...) скорость видимо будет не слишком сильно отличаться в сравнении new-delete. Я изменил алгоритм обработки. Потребление памяти сократилось на порядок, но управление программой стало чуть сложнее. Пользователю будет сложнее. Вынужденная мера.
Думал будут предлагать перейти на Builder 9 или скажут как изменить настройки в среде программирования, чтобы изменить максимальный объём доступной, написанной программе, памяти.
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!