为什么会抛出SIGSEGV?(堆已分配std::array)



我希望构建一个结构的1Dstd::array,每个结构的大小为16字节。1D阵列是表示3D阵列(基本上是具有一些3D特定运算符和其他绒毛的std::array包装器(的类的平坦化。我的第一次尝试是一个大小为256 x 256 x 32的数组,大约为35MB,这会引发SIGSEGV错误。

一切的简化示例如下:

结构.cpp

struct Coord {
int x;
int y;
int z;
Coord() { }
Coord(int x_, int y_, int z_) { x = x_; y = y_; z = z_; }
}
int TR (int arg) { 
// ... Some transformation 
} 
struct MyStruct {
Coord position;
int terrain;
MyStruct() { }
MyStruct(int x_, int y_, int z_, int terrain_) { 
terrain = terrain_;
position = Coord(TR(x_), TR(y_), TR(z_));
}
}

ArrayWrapper.hpp

#include <array>
template <typename T, int HSIZE, int VSIZE> struct ArrayWrapper { 
private:
std::array<T, HSIZE*HSIZE*VSIZE> narray;
public:
void set(T obj, int x, int y, int z) {
narray[x + z*HSIZE + y*HSIZE*HSIZE] = obj;
}
T& operator() (int x, int y, int z) {
return narray.at(x + z*HSIZE + y*HSIZE*HSIZE);
}

坐标映射.cpp

#include "ArrayWrapper.hpp"
#include "Structs.cpp"
const int HSIZE = 256;
const int VSIZE = 32;
class CMap {
private: 
ArrayWrapper<MyStruct, HSIZE, VSIZE>* coords_ = new ArrayWrapper<MyStruct, HSIZE, VSIZE>;
ArrayWrapper<MyStruct, HSIZE, VSIZE> coords = *coords_;
public:
// ... Getter, setter, and a bunch of other methods, 
~CMap() { delete coords; }
}

如果我在任何地方尝试说CMap something;,我会得到SIGSEGV。我知道堆栈相对较小,所以我尝试使用new在堆上分配这个结构。许多人(在这个网站和其他网站上(说"找到大范围的连续内存是很困难的,即使它在堆上",但没有给出对连续内存大小的合理预期。我认为在现代计算机中32MB是可行的。

什么可能是投掷Seg。这里有错吗?

ArrayWrapper<MyStruct, HSIZE, VSIZE> coords = *coords_;

应该是…

ArrayWrapper<MyStruct, HSIZE, VSIZE>& coords = *coords_;

这是有道理的。第1行是coords_引用的副本,在这种情况下,这与使用new的目的背道而驰,因为该副本被放在堆栈上。

相关内容

  • 没有找到相关文章

最新更新