在类中了解std :: tuple的静态大小数组的segfault

时间:2014-10-16 08:59:25

标签: arrays c++11 stdtuple

我有一个类,我想为图像中的每个像素存储三个数据点。我认为std :: tuple是一个很好的方法,所以:

class CameraManager {
private:
    static const int width_  = 700;
    static const int height_ = 574;
     //this causes a segfault...
    std::tuple<double,double,bool> mapping_[width_][height_];

public:
    CameraManager();

}

段错误直接发生在main(int argc,char ** argv),因为我在此函数中声明了一个相机管理器对象。

这里发生了什么?

2 个答案:

答案 0 :(得分:2)

你在你的电话堆栈上放了6MB这样的东西。它确实处于您希望避免自动存储持续时间的大小。

尝试动态分配。

答案 1 :(得分:1)

让我们进行一些计算:std::tuple<double,double,bool>费用大约为some machines上的24个字节,因此矩阵700x574将花费大约9&#643;&#39; 200字节,这是〜 10MB。

大多数实现分配1MB,可能是2MB的堆栈大小。如果您的实现允许您指定更大的堆栈大小,则将其设置为大于~12MB的内容。

否则动态分配mapping_

using my_tuple = std::tuple<double,double,bool>;
std::vector<my_tuple> mapping_;

然后:

CameraManager() : mapping_(width_ * height_) { ... }

并且可以在vector上创建一个简单的矩阵视图。