ОБСУЖДЕНИЕ

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

2 ответов 6,2 тыс.
AI-выжимка обсуждения скоро

Краткие тезисы обсуждения со ссылками на ключевые ответы появятся здесь.

Статус
Закрыто для дальнейших ответов.
Автор темы
Написанная программа нормально работала до тех пор пока требовалось ей не более 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 гига.

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