首页 文章

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

提问于
浏览
-1

我有一个类,我想为图像中的每个像素存储三个数据点 . 我认为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();

}

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

这里发生了什么?

2 回答

  • 1

    你在调用堆栈上放了6MB这样的东西 . 它实际上是你希望避免自动存储持续时间的大小 .

    尝试动态分配它 .

  • 2

    让我们做一些计算: std::tuple<double,double,bool>some machines上花费大约24个字节,因此矩阵700x574将花费大约9 '643' 200字节,即~10MB .

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

    否则动态分配 mapping_

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

    然后:

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

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

相关问题