Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Segfault在构造函数中,但仅使用某些模板参数_C++_Templates_C++11_Constructor_Segmentation Fault - Fatal编程技术网

C++ Segfault在构造函数中,但仅使用某些模板参数

C++ Segfault在构造函数中,但仅使用某些模板参数,c++,templates,c++11,constructor,segmentation-fault,C++,Templates,C++11,Constructor,Segmentation Fault,我正在尝试编写一个用于绘制mandelbrot分形的小助手类。类Canvas有两个二维数组,一个用于存储复杂平面的坐标,另一个用于获得2次以上的|z所需的迭代次数 模板参数以像素为单位指定画布的宽度和高度。现在有趣的是,对于的参数,一切都可以正常工作,但是如果我选择例如,我会得到一个分段错误。我已经用array.at()而不是array[]检查了越界错误,但仍然没有任何结果 template <std::size_t W, std::size_t H> class Canvas {

我正在尝试编写一个用于绘制mandelbrot分形的小助手类。类
Canvas
有两个二维数组,一个用于存储复杂平面的坐标,另一个用于获得2次以上的
|z
所需的迭代次数

模板参数以像素为单位指定画布的宽度和高度。现在有趣的是,对于
的参数,一切都可以正常工作,但是如果我选择例如
,我会得到一个分段错误。我已经用
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));
        }
    }
}
模板
类画布
{
公众:
画布(std::complex _原点,std::complex _端点);
...
私人:
复杂起源;
std:复合端;
std::数组字段;
std::数组结果;
};
模板
Canvas::Canvas(标准::复杂_原点,
标准::复杂(完)
:origin{u origin},end{u end}
{
双delta_x{end.real()-origin.real()};
双delta_y{end.imag()-origin.imag()};
双级_x{delta_x/静态_u-cast(W-1)};
双阶梯{delta{y/静态{u投射(H-1)};
对于(标准::尺寸w=0;w
我已经运行了代码,似乎得到的是堆栈溢出(讽刺)。 您可以看到这一点,因为它在以下位置失败:

; Find next lower page and probe

cs20:
        sub     eax, _PAGESIZE_         ; decrease by PAGESIZE
        test    dword ptr [eax],eax     ; probe page. <------ HERE
        jmp     short cs10
;找到下一页并探测
cs20:
子eax,页面大小;按页面大小减少

测试dword ptr[eax],eax;探测页面 我已经运行了代码,似乎得到的是堆栈溢出(讽刺)。 您可以看到这一点,因为它在以下位置失败:

; Find next lower page and probe

cs20:
        sub     eax, _PAGESIZE_         ; decrease by PAGESIZE
        test    dword ptr [eax],eax     ; probe page. <------ HERE
        jmp     short cs10
;找到下一页并探测
cs20:
子eax,页面大小;按页面大小减少

测试dword ptr[eax],eax;探测页面 我认为您的问题可能是在堆栈上分配
Canvas
的实例。如果你有这样的东西:

void f()
{
    std::complex<double> origin( 0, 0 );
    std::complex<double> end( 100, 100 );

    Canvas< 600, 600 > cv( origin, end );
    // ...
}
void f()
{
复杂原点(0,0);
标准:复合端(100100);
画布<600,600>cv(起点,终点);
// ...
}
您可能需要检查在堆上分配对象是否有帮助:

void f()
{
    std::complex<double> origin( 0, 0 );
    std::complex<double> end( 100, 100 );

    typedef Canvas< 600, 600 > CV
    auto cv_ptr = std::unique_ptr< CV >( new CV( origin, end ) );
    // ...
}
void f()
{
复杂原点(0,0);
标准:复合端(100100);
类型定义画布<600,600>CV
自动cv_ptr=std::unique_ptr(新cv(起点,终点));
// ...
}

我认为您的问题可能是在堆栈上分配了
Canvas
的实例。如果你有这样的东西:

void f()
{
    std::complex<double> origin( 0, 0 );
    std::complex<double> end( 100, 100 );

    Canvas< 600, 600 > cv( origin, end );
    // ...
}
void f()
{
复杂原点(0,0);
标准:复合端(100100);
画布<600,600>cv(起点,终点);
// ...
}
您可能需要检查在堆上分配对象是否有帮助:

void f()
{
    std::complex<double> origin( 0, 0 );
    std::complex<double> end( 100, 100 );

    typedef Canvas< 600, 600 > CV
    auto cv_ptr = std::unique_ptr< CV >( new CV( origin, end ) );
    // ...
}
void f()
{
复杂原点(0,0);
标准:复合端(100100);
类型定义画布<600,600>CV
自动cv_ptr=std::unique_ptr(新cv(起点,终点));
// ...
}

故障发生在哪里?你能用注释标记这一行吗?对不起,我不知道确切的那一行,只是它在构造函数中。你可以使用调试器来查找这一行。你调用构造函数的对象,可能没有在堆栈上分配它(也称为自动存储)?因为,你知道,它是巨大的…你在哪里在堆上或堆栈上创建
Canvas
的实例?segfault发生在哪里?你能用注释标记这一行吗?对不起,我不知道确切的那一行,只是它在构造函数中。你可以使用调试器来查找这一行。你调用构造函数的对象,可能没有在堆栈上分配它(也称为自动存储)?因为,你知道,它是巨大的…你在哪里在堆上或堆栈上创建
Canvas
的实例?