Понимание segfault со статическим размером массива std::tuple в классе
У меня есть класс, где я хочу хранить три точки данных для каждого пикселя в изображении. Я подумал, что 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 ответа
Вы кладете что-то вроде 6 МБ в стек вызовов с этим. Это действительно тот размер, когда вы хотите избежать автоматического хранения.
Попробуйте выделить его динамически.
Давайте сделаем некоторые расчеты: std::tuple<double,double,bool>
на некоторых машинах стоит примерно 24 байта, поэтому матрица 700x574 будет стоить около 9'643'200 байтов, что составляет ~10 МБ.
Большинство реализаций выделяют 1 МБ, может быть, 2 МБ стека. Если ваша реализация позволяет вам указать больший размер стека, установите для него значение, превышающее ~12 МБ.
В противном случае выделить mapping_
динамически:
using my_tuple = std::tuple<double,double,bool>;
std::vector<my_tuple> mapping_;
а потом:
CameraManager() : mapping_(width_ * height_) { ... }
и, возможно, создать простой матричный вид над этим vector
,