Застрял с необработанным исключением на 0x00007FF74F27A526: переполнение стека - PullRequest
0 голосов
/ 21 ноября 2018

У меня возникла исключительная ситуация, связанная с переполнением стека.Чтобы было ясно, у меня нет рекурсивной функции, которая может привести к взрыву стека.Хотя где-то в моем приложении я создаю огромный массив с помощью std :: array и использую шаблоны классов.

Я думал о динамическом выделении памяти, но это последнее, что я хочу сделать, также в шаблонной функции, которая вызывает у меня проблему следующим образом:

//class Template
template <class T, int Point, int End>
class Node;
private:
int Point;
int End;
std::array <T, Point*End>;
public:
// Rest of the stuff!
//Operator defined in class
//End of Node object1 is equal to Point of Node object2 always so;

template <int entry>
Node<T,Point,entry> operator* (const Node<T,End,entry> &source)
{
  Node<T,Point,entry> temporary_node(0.);

//for_loop to multiply each element store in std::array

return temporary_node;
}

Важноупомяните, что мой размер массива где-то около 10000000.

  1. Каково решение, если я не хочу использовать динамическое выделение памяти:

    • Скажем, если я это сделаю, то как я могу динамически выделять память для временного узла в операторе *, определенном выше, так как он занимает память для вектора, когда я делаю это:

      Узел временный_узел;

  2. Я нахожусь в Windows, и я также не хочу увеличивать размер стека вручную, так как ручное использование более 1 МБ решит проблему, но это будет рискованно и, возможно, с ошибками.

Заранее спасибо.

Редактировать

Я только что проверил его в Linux, и он отлично работает там.Возможно, потому что я думал, что размер стека для linux составляет около 8 МБ, учитывая также и Virtual.Но тьфу!Это сделает приложение менее дружественным к кроссплатформенным приложениям, если я не собираюсь использовать его для диапазона стеков Windows по умолчанию.

1 Ответ

0 голосов
/ 21 ноября 2018

Вы просто не можете создавать такие большие объекты в стеке, вместо этого вы должны создать их в куче.

template <int entry>
std::unique_ptr<Node<T,Point,entry>> operator* (const Node<T,End,entry> &source)
{
  auto temporary_node = std::make_unique<Node<T,Point,entry>>(0.);

  //for_loop to multiply each element store in std::array

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