gpt4 book ai didi

c++ - 为什么这个内存代码会出现段错误?

转载 作者:行者123 更新时间:2023-11-28 05:33:42 30 4
gpt4 key购买 nike

我有以下代码计算给定 n 和 k 的第二类斯特林数,

#include <cstdint>
#include <map>

#include <boost/multiprecision/cpp_int.hpp>

namespace mp = boost::multiprecision;


mp::cpp_int stirlingS2(unsigned n, unsigned k)
{
if (n == 0 && k == 0) {
return 1;
}

if (n == 0 || k == 0) {
return 0;
}

static auto memo = std::map<std::pair<unsigned, unsigned>, mp::cpp_int>();
auto nKPair = std::pair<unsigned, unsigned>(n, k);

if (memo.count(nKPair) > 0) {
return memo[nKPair];
}

auto val = k * stirlingS2(n - 1, k) + stirlingS2(n - 1, k - 1);

memo[nKPair] = val;

return val;
}

不幸的是,这段代码在运行时会出现段错误。对于插入到 memo 中的前 87795 个值,它似乎运行良好,但此后不久就崩溃了。具体来说,段错误发生在 map::count 处,在 if (memo.count(nKPair) > 0) { 行中。我认为这可能是 memo 大小用完的问题,所以我在分配给 memo 时添加了以下警告,

if (memo.size() < memo.max_size()) {
memo[nKPair] = val;
}

但这并没有帮助。我还注意到 87795 值并不表示崩溃的时间。通过一些小的修改,将第一个 if 语句更改为,

if (n <= k) {
return 1;
}

将该值更改为 66453。

有人知道这里发生了什么吗?

最佳答案

好的,经过几个小时的困惑,我将问题缩小到表达式模板问题。我不太明白为什么,但这一切都与行中的那个小 auto

有关
auto val = k * stirlingS2(n - 1, k) + stirlingS2(n - 1, k - 1)

基本上,将 auto 更改为 mp::cpp_int 突然,没有段错误。

关于c++ - 为什么这个内存代码会出现段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38839134/

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