首页 > 解决方案 > 在 0x00007FF74F27A526 处遇到未处理的异常:堆栈内存溢出

问题描述

我有堆栈溢出相关的异常。要明确这一点,我没有可能导致堆栈爆炸的递归函数。尽管在我的应用程序的某个地方,我正在使用 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 上,我也不想手动增加堆栈大小,因为手动超过 1MB 可以解决问题,但这会很冒险,而且可能有问题。

先感谢您。

编辑

我刚刚在 Linux 上检查了它,它在那里工作得非常好。也许是因为我认为 linux 的堆栈大小也考虑到 Virtual 大约 8MB。但是啊!如果我不考虑使其适用于 Windows 堆栈默认范围,这将使应用程序的跨平台友好性降低。

标签: c++c++11templates

解决方案


您根本无法在堆栈上创建如此大的对象,而必须在堆上创建它们。

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;
}

推荐阅读