c++ - 构造函数中的段错误,但仅限于某些模板参数

标签 c++ templates c++11 constructor segmentation-fault

我正在尝试编写一个小助手类来绘制曼德尔布罗分形。类(class)Canvas有两个二维数组,一个存储复平面的坐标,一个存储得到|z|所需的迭代次数超过 2.

模板参数以像素为单位指定 Canvas 的宽度和高度。现在有趣的是,对于
<500, 500> 的参数一切正常。 , 但如果我选择例如 <600, 600>我遇到段错误。我已经使用 array.at() 检查了越界错误而不是 array[]但仍然没有。

template <std::size_t W, std::size_t H>
class Canvas
{
public:
    Canvas(std::complex<double> _origin, std::complex<double> _end);
    ...


private:
    std::complex<double> origin;
    std::complex<double> end;
    std::array<std::array<std::complex<double>, H>, W> field;
    std::array<std::array<std::pair<bool, int>, H>, W> results;
};


template <std::size_t W, std::size_t H>
Canvas<W, H>::Canvas(std::complex<double> _origin, 
                     std::complex<double> _end)
    : origin{_origin}, end{_end}
{
    double delta_x {end.real() - origin.real()};
    double delta_y {end.imag() - origin.imag()};
    double step_x {delta_x / static_cast<double>(W-1)};
    double step_y {delta_y / static_cast<double>(H-1)};

    for (std::size_t w = 0; w < W; ++w)
    {
        for (std::size_t h = 0; h < H; ++h)
        {
            field[w][h].real(origin.real() + (step_x*w));
            field[w][h].imag(origin.imag() + (step_y*h));
        }
    }
}

最佳答案

我已经运行了代码,你得到的似乎是堆栈溢出(讽刺)。 你可以看到,因为它失败了:

; Find next lower page and probe

cs20:
        sub     eax, _PAGESIZE_         ; decrease by PAGESIZE
        test    dword ptr [eax],eax     ; probe page. <------ HERE
        jmp     short cs10

您还可以从以下事实中看出这一点:在数字开始变大并将其分配到堆上解决了问题之后,它在某个时间点后开始失败。 您的 Canvas 对象之所以如此巨大,是因为:

std::array<std::array<std::complex<double>, H>, W> field;
std::array<std::array<std::pair<bool, int>, H>, W> results;

两种尺寸 H * W * sizeof(complex<double>)H * W * sizeof(pair<bool,int>) . 我建议您只在堆上使用此类,并且在使用高模板编号时不要在堆栈上分配它(对于 400、400,我已经失败了)。

关于c++ - 构造函数中的段错误,但仅限于某些模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19435185/

相关文章:

c++ - GCC 编译器无法编译 Hello World 程序

python - 有没有办法限制 Django 模板中标签和过滤器的使用?

c++ - 派生类中的方法调用列表

c++ - 默认定义声明的不完整冗长

c++ - 在 C/C++ 中,是否有一种计算有效的方法可以在多维数组中存储小于字节的值?

c++ - 在 C++ 中声明一个没有初始化的全局变量

c++ - 如何从 lambda 中的函数返回?

c++ - Lambda 以迭代器为参数

c++ - GTKmm Hello World 编译错误

c++ - 模板参数包 : How to create a Tuple of an independent type with same length