构造函数中的隔离错误,但仅限于某些模板参数
Segfault in constructor, but only with certain template arguments
我正在尝试编写一个小的辅助类来绘制曼德布洛特分形。类 Canvas
有两个二维数组,一个用于存储复平面的坐标,另一个用于获得超过 2 |z|
所需的迭代次数。
模板参数以像素为单位指定画布的宽度和高度。现在有趣的是,一切都可以通过
参数<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 对我来说已经失败了)。
我认为您的问题可能是您在堆栈上分配了Canvas
的实例。如果你有这样的东西:
void f()
{
std::complex<double> origin( 0, 0 );
std::complex<double> end( 100, 100 );
Canvas< 600, 600 > cv( origin, end );
// ...
}
您可能需要检查在堆上分配对象是否有帮助:
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 ) );
// ...
}
相关文章:
- 类成员函数参数列表是否可以依赖于模板参数?
- 专用于可变参数模板成员函数
- C++ 使函数调用依赖于模板参数
- 如何修复"没有依赖于模板参数的参数'glGenVertexArrays'......"C++ 中的错误
- 使用迭代器成员函数是否仅适用于某些向量类型"empty()"?
- OpenSSL AES仅适用于某些计算机,即使具有静态链接也是如此
- 在 Eclipse 中漂亮的打印C++适用于某些项目,而不适用于其他项目
- 将 std::bind 应用于带有参数 <boost::asio::ip::tcp::socket> 时出错?
- 保证复制 elis 是否适用于函数参数?
- Vigenere密码的C++功能有时才起作用(适用于某些输入,跳过其他输入的班次)
- 为什么 OpenCL 嵌套循环仅适用于某些元素
- 部分专用于可变参数模板类的方法
- 将 const 限定符应用于模板参数时的不同编译器行为
- 仅适用于某些模板类型的覆盖方法
- 如何定义依赖于模板参数的类型定义
- 使用 std::应用于可变参数包
- 类型依赖于可变参数模板的类
- 如何将函数应用于可变参数列表并将它们猫到元组
- 仅继承父构造函数的某些参数
- 在老板层次结构中查找"top"老板仅适用于某些测试用例