C++ Segfault在构造函数中,但仅使用某些模板参数
我正在尝试编写一个用于绘制mandelbrot分形的小助手类。类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 {
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
的实例?