gpt4 book ai didi

使用较小内存量时出现 C++ std::bad_alloc 错误?

转载 作者:行者123 更新时间:2023-11-30 03:17:56 30 4
gpt4 key购买 nike

我做了一个函数,它能够存储所有 secret 数字的解决方案,然后在算法中使用。

这个函数对某些输入值非常有效;但是,对于某些人来说它不起作用。问题是我收到一个与使用过多内存有关的错误,考虑到这没有意义:

生成多少个数字的限制是:

int possibilities = std::pow(symbols, length);

当你这样做时:

generate_list( list , 6, 4 ); it generates 4^6 different numbers = 4096

但是当你这样做的时候:

 generate_list( list , 4, 6 ); it does not generates 6^4 numbers = 1296 due to error

当它生成较少的数字时,它如何给出内存不足的错误?

错误是:

    terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc

最佳答案

它与内存分配本身没有任何关系。

问题出在这几行

        int zerosneeded = length - tmp.size();

while (zerosneeded != 0) {
tmp.push_back(0);
zerosneeded--;
}

在不知道它为什么这样做的情况下,我在查看代码时遇到的问题是“zerosneeded 可以小于零吗?”。特别是因为 zerosneeded定义为 int而不是 unsigned int (适用于代码的其余部分)。

如果zerosneeded小于零,就会无限循环分配直到耗尽。快速检查确认了这一点:

int zerosneeded = length - tmp.size();
if(zerosneeded < 0)
{
std::cout << "fatal, zerosneeded < 0 \n";
throw std::runtime_exception("fatal, zerosneeded < 0");
}

我希望这对您的调试有帮助。

编辑

至于为什么zerosneeded是负数:

首先计算可能的个数,即symbols^length。

int possibilities = std::pow(symbols, length);

当将值推送到 tmp 时,我们基本上找到第一个 x 使得 length^x > quotient。商在 [0,symbols^length] 范围内,用于将值插入 tmp。

int quotient = i;
while (quotient!=0) {
tmp.push_back(quotient % length);
quotient = quotient / length;
}

如果 symbols^length > length^length,首先 x 使 length^x > 商产生 x > length,使得 int zerosneeded = length - tmp.size();变得消极。

例如,我们的长度 = 4,符号 = 6,因此商的范围为 [0,6^4] = [0, 1296]。但是对于 256,我们已经有 4^4 = 256 => 4^5 > 256,所以我们的 x = 5 => zerosneeded = 4 - 5 = -1。

这对于 length = 4 和 symbols = 6 没有什么特别的,只要 length < symbols 实际上应该发生。

关于使用较小内存量时出现 C++ std::bad_alloc 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55090887/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com