C++ &引用;虚拟内存耗尽:无法分配内存“;仅当使用调试标志编译时

C++ &引用;虚拟内存耗尽:无法分配内存“;仅当使用调试标志编译时,c++,compiler-errors,out-of-memory,stdmap,C++,Compiler Errors,Out Of Memory,Stdmap,我使用以下代码(error.cpp)获得错误: 我的系统是Ubuntu18.04,g++7.5.0作为虚拟机运行。 RAM为5GB,交换容量为2.5GB。硬盘空间剩余1GB 这正常吗?虫子?限制 对于上述代码,什么是“更好的”替代方案?(c++14)这个定义中有8+7+6个字符串,对吗?所以,我想说你手上的是一个21的关系。为什么不试试: constexpr const std::size_t my_arity = 21; std::unordered_set<std::array<

我使用以下代码(error.cpp)获得错误:

我的系统是Ubuntu18.04,g++7.5.0作为虚拟机运行。 RAM为5GB,交换容量为2.5GB。硬盘空间剩余1GB

这正常吗?虫子?限制


对于上述代码,什么是“更好的”替代方案?(c++14)

这个定义中有8+7+6个字符串,对吗?所以,我想说你手上的是一个21的关系。为什么不试试:

constexpr const std::size_t my_arity = 21;
std::unordered_set<std::array<std::string, my_arity>> oups;
constexpr const std::size\t my\u arity=21;
std::无序的集合OUP;

取而代之的是?

什么才是“更好的”,也许是不那么荒谬的?好消息!Visual Studio同意<代码>致命错误C1060:编译器的堆空间不足有趣的是,撇开用法不谈,有人能为作者的问题提供一个真实的答案吗?关于发生什么以及为什么会发生这种情况?我的意思是,20层嵌套模板并不多,是否有一些分支导致指数?听起来你只是想要一个以字符串结构作为键的映射。@jav-我不认为这是标准的问题。这是代码中的一个问题。标准中的非规范性内容是建议或(在本例中)建议,并不意味着需要任何诊断。从本质上讲,如果您编写的代码超出了建议的范围(正如您所做的),那么您可能会遇到更大的问题,比如编译器崩溃。对于在调试构建中看到问题,而不是“不使用调试标志”时看到问题,有许多可能的解释。这正是我应该使用的。我需要的是地图,而不是杂乱无章的集合。现在要接受一个答案,我想我还需要知道为什么会发生错误。这对社区来说会更有用。嗯,我想应该是为堆上的几个节点创建了一个带有存储的映射。假设它有4个节点。现在,随着每一个级别的深入,您可以将最深级别上使用的存储量乘以该系数。所以,4^21=2^42这是一个很大的内存!@einpoklum:现在我们必须记住,只有在使用调试标志时才会出现错误。没有这个标志,编译速度非常快,没有问题。我使用了类似的东西。希望有一天我们能得到原始代码失败的确切原因。
g++ error.cpp -g -o error
constexpr const std::size_t my_arity = 21;
std::unordered_set<std::array<std::string, my_arity>> oups;