Ошибка нехватки памяти в приложении C++/MFC

У меня есть старое приложение Doc/View C++/MFC, разработанное с использованием VS 6. Я использую Stingray Objective Grid 8.01 Pro в качестве своей сетки данных.

В последнее время наши размеры "работы" стали намного больше; и именно тогда начали появляться ошибки "Недостаточно памяти".

Вот сценарий, который дает мне ошибку нехватки памяти:

К вашему сведению, когда я говорю, я загружаю работу в сценарии ниже; это означает, что я читаю БД и загружаю данные, связанные с этим заданием, в память, используя пользовательские классы, которые хранят данные в объектах CArray и CList; который хранится в классе документа. Кроме того, я храню некоторые из этих данных в двух сетках StingRay в главном представлении для этого документа.

Когда я впервые открываю приложение, оно показывает около 21 МБ использования памяти в Task Mgr. Я начинаю с загрузки обычной работы, и приложение занимает около 40 МБ. Затем я загружаю "большую" работу, а затем приложение увеличивается до 159 МБ. Затем я закрываю "большую" работу, и приложение падает примерно до 40 МБ. Затем я снова загружаю ту же "большую" работу, и она возвращается примерно к 159 МБ. Затем я открываю немодальное окно, которое содержит сетку StingRay и заполняю сетку данными из работы. Когда это происходит, использование памяти приложения увеличивается до 1421 МБ. Затем я закрываю немодальное окно, и оно возвращается примерно к 163 МБ. Затем я закрываю "большую" работу, и она возвращается примерно к 45 МБ. Затем я пытаюсь снова открыть ту же самую "большую" работу, и когда я начинаю перезагружать сетки Stingray в главном окне (не в немодальном окне), я получаю ошибку "Недостаточно памяти". В этот момент приложение показывает около 170 МБ в диспетчере задач.

Поскольку я могу закрывать и повторно открывать задания без каких-либо проблем, я могу только предполагать, что когда я загружаю данные в сетку Stingray в немодальном окне; что-то не освобождается; но если это так, то почему мое использование памяти в диспетчере задач возвращается к почти нормальному уровню после закрытия немодального окна. Это только около 5 МБ больше после закрытия немодального окна.

Что мне действительно нужно, так это некоторые предложения о том, как попытаться определить причину ошибки из-за того, что мое приложение использует только 160 МБ, когда оно говорит о нехватке памяти.

Любая помощь будет оценена.

Спасибо,

Фил

1 ответ

Получение 1421 МБ при загрузке сетки неудобно близко к диапазону адресов 2 ГБ, который вы можете использовать в 32-разрядном приложении. Конечно, верное решение - стать 64-битным приложением, если это возможно. Другая вещь, которую вы можете попробовать, это использовать виртуальный режим сетки, чтобы сетка не дублировала данные. В виртуальном режиме вы получаете обратный вызов для каждой окрашиваемой строки или ячейки и передаете ей данные из хранилища документов.

Другие вопросы по тегам