我有一个类,我想为图像中的每个像素存储三个数据点。我认为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),因为我在此函数中声明了一个相机管理器对象。
这里发生了什么?
答案 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
上创建一个简单的矩阵视图。