【发布时间】:2018-12-14 15:05:32
【问题描述】:
我正在使用 C++ 构建一个 iOS 应用程序,但遇到了一个大型数组的问题。问题是,如果数组达到一定大小,我会收到 EXC_BAD_ACCESS (SIGSEGV) 类型的异常,子类型 KERN_PROTECTION_FAILURE,并带有分段错误 (11) 终止信号。
有趣的是,无论我将数组放在堆栈上还是堆上,我都会收到该异常。
将数组放入堆栈的代码如下所示:
class Model
{
public:
Model() { };
private:
static constexpr std::size_t VERTEX_COUNT = 25894;
Vertex _vertices[VERTEX_COUNT] =
{
{ { 46.629387f, 647.478271f, 58.987785f }, { 0.140482f, 0.716024f, 0.683795f }, false },
{ { 86.409439f, 639.203247f, 57.095085f }, { 0.273239f, 0.689217f, 0.671059f }, false },
{ { 94.825722f, 586.618164f, 91.772812f }, { 0.375726f, 0.404750f, 0.833671f }, false },
{ { 50.570183f, 586.068481f, 100.536209f }, { -0.003906f, 0.451161f, 0.892434f }, false },
// 25894 array entries in total
};
// all the rest
}
用于填充数组的结构如下所示:
struct Vertex
{
Vertex()
{
}
Vertex(glm::vec3 coords, glm::vec3 norm, bool selected) :
coordinates(coords),
normal(norm),
isSelected(selected)
{
}
glm::vec3 coordinates;
glm::vec3 normal;
bool isSelected;
};
一旦模型实例被实例化,上面的代码就会在 iOS 11.4 上崩溃。
现在,即使我换行也会发生这种情况
Vertex _vertices[VERTEX_COUNT] =
to(在堆上分配内存)
Vertex* _vertices = new Vertex[VERTEX_COUNT]
或到
std::unique_ptr<Vertex[]> _vertices = std::unique_ptr<Vertex[]>(new Vertex[VERTEX_COUNT]
或者将整个数组定义移动到Model的构造函数中。
到目前为止,我唯一能让它发挥作用的方法就是改变
Vertex _vertices[VERTEX_COUNT] =
到
static constexpr Vertex _vertices[VERTEX_COUNT] =
并将相应的 constexpr 构造函数添加到 Vertex 结构。但是,我需要能够在运行时编辑数组,因此不能将其声明为 static constexpr。
有人知道这里可能发生了什么吗?
【问题讨论】:
-
听起来您正在创建多个
Model实例,因此很快就会耗尽内存。static_vertices成员做到了,所以只有 1 个大数组而不是 N -
把
constexpr去掉,在类外初始化不就行了吗? -
@AndyG:即使我只创建
Model的单个实例,我也遇到了问题。一旦创建了这个实例,问题就来了。 -
@TedLyngmo:你的意思是让数组只是静态的吗?
-
是的,我就是这么想的。该数组有多大(以字节为单位)? 621456-828608字节什么的?你能做
new char[828608];或`char a[828608];没有问题?
标签: c++ ios segmentation-fault clang