-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();

}

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

这里发生了什么?

4

2 回答 2

2

你在你的调用堆栈上放了6MB的东西。它确实是您想要避免自动存储持续时间的那种大小。

尝试动态分配它。

于 2014-10-16T09:07:33.217 回答
1

让我们进行一些计算:在某些机器std::tuple<double,double,bool>上大约需要 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

于 2014-10-16T13:33:01.363 回答