Я создаю приложение для iOS с использованием C ++ и столкнулся с проблемой большого массива.Проблема заключается в том, что если массив достигает определенного размера, я получаю исключение типа EXC_BAD_ACCESS (SIGSEGV), подтип KERN_PROTECTION_FAILURE, с сигналом завершения ошибки сегментации (11).
Интересным аспектом является то, что I 'Я получаю это исключение независимо от того, помещаю ли я массив в стек или в кучу.
Код, помещающий массив в стек, выглядит следующим образом:
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, как только создается экземпляр экземпляра Model.
Теперь это происходит, даже если я изменяю строку
Vertex _vertices[VERTEX_COUNT] =
в (выделение памяти в куче)
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
.
Кто-нибудь знает, что здесь происходит?