Как объявление большого 2D-массива может привести к сбою программы?

0

Windows Embedded Compact 7.

Запуск приложения на 16 КБ с USB-накопителя.

В основном у меня есть функции1() и function2();

Функция1() запускает и распечатывает некоторую информацию просто отлично.

Затем программа умирает.

(Возврат к командной строке (карманный cmd v 7.00).)

Функция2 содержит декларацию вверху. Это для двухмерного массива удвоений, используемого в расчете, который фактически закомментирован в то время.

function2()
{

    LARGE_INTEGER li;   
    double time[PRIORITY_LEVELS][ITERATIONS]; // 256 X 1000
    double difference[ITERATIONS - 1] = {0};

Часть, которая не имеет смысла:
Я прокомментирую объявление для массива 2d (удаляю его) - программа запустит остальную часть содержимого функции2() правильно.

Что, возможно, проблема здесь или как я могу даже узнать?

У меня 8 ГБ оперативной памяти. Этого должно быть более чем достаточно для 256X1000 8-байтового двойника, верно?

Любая помощь приветствуется.

  • 2
    Вы принимаете физическую RAM за память, доступную для процесса ...
  • 0
    @ simon-whitehead: что воняет, почему процесс не может использовать больше, встроенный компактный образ должен работать очень маленьким, верно?
Показать ещё 5 комментариев
Теги:
window
windows-ce

2 ответа

7
Лучший ответ

Вы пытаетесь выделить около 2 мегабайт пространства в стеке, что взорвало его. 1MB - приблизительный обычный размер стека (который может быть на самом деле меньше на вашей конкретной платформе, я не знаю специфики), поэтому вы не хотите выделять большие массивы там. Вместо этого вы должны купировать выделение массива, то есть:

double* time[PRIORITY_LEVELS];
for (int i = 0; i < PRIORITY_LEVELS; ++i)
{
    time[i] = new double[ITERATIONS];
}

Это займет всего лишь 256 указателей на стопку, то есть 1KB, предполагая 32-битный процесс.

Тот факт, что у вас 8 ГБ ОЗУ, не имеет значения; только 2 ГБ будет адресуться вашим процессом (предполагая 32 бита), и у вас будет только 1 МБ пространства стека на поток.

  • 2
    @PS Этот код предназначен для double time[PRIORITY_LEVELS][ITERATIONS]; замены вашей строки double time[PRIORITY_LEVELS][ITERATIONS]; , Вам также нужно будет delete[] все массивы, которые вы выделили с помощью new[] иначе они будут вытекать.
  • 3
    Или вы можете использовать - std::vector<std::vector<double>> time(PRIORITY_LEVELS, std::vector<double>(ITERATIONS)); - и не беспокойтесь об утечках памяти.
Показать ещё 2 комментария
4

у вас 8GB RAMS, но не все из них пойдут в ваш процесс
матрица слишком велика, чтобы выделяться в стеке, вместо этого попробуйте выделить ее в кучу.

  • 1
    Это массив ... он уже выделен в куче.
  • 1
    @SimonWhitehead: Это может иметь место для C #, но не для C или C ++.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню