исключение stackoverflow в нерекурсивном контексте - PullRequest
1 голос
/ 27 июля 2010

У меня есть приложение, которое извлекает данные из базы данных и сохраняет их в памяти для последующего использования. Я протестировал это приложение для примерно 7000 строк данных, но когда я хочу использовать его для 10000 или более, я столкнулся с исключением StackOverflow. Это так странно, потому что я думаю, что я должен получить OutOfMemory, а не Stackoverflow, если мои данные слишком велики.

1 Ответ

2 голосов
/ 27 июля 2010

Вы правы конечно.Получить переполнение стека в коде C / C ++ довольно легко:

int _tmain(int argc, _TCHAR* argv[])
{
    char buffer[4 * 1024 * 1024];
    return 0;
}

4, чтобы убедиться, что он работает и в 64-битном режиме.Но массивы являются ссылочными типами в управляемом коде.Они распределяются в куче, а не в стеке.В коде C # вы должны будете выделить тип значения в качестве локальной переменной, чтобы поглотить пространство стека.И единственный тип значения типа, который подходит для того, чтобы получить вас где-либо с этим, - это структура.Это сложно , вам нужно будет объявить структуру, в которой четверть миллиона членов, давать или брать.Единственный возможный способ получить один из них - это структура, которая была автоматически сгенерирована из какого-то инструмента, и огромная схема базы данных.

Этого просто не происходит.Конечно, проблема находится в вашем провайдере базы данных.Неизменно написано на C или C ++.И делать что-то неприятное, например, использовать _alloca (), чтобы уничтожить стек.Ключевое слово stackalloc в C #.Я не буду упоминать утилиту editbin.exe с аргументом / stack, чтобы увеличить размер стека основного потока, вам не нужно с этим мириться.*

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...